Java: изменение размера многомерного массива

У меня есть многомерный массив, построенный из строк, который изначально создан с размером [50][50], это слишком большой, и теперь массив полон нулевых значений, в настоящее время я пытаюсь удалить эти указанные нулевые значения, мне удалось изменить размер массива до [requiredSize][50], но не может уменьшить его, может кто-нибудь помочь мне с этим? Я искал Интернет для такого ответа, но не могу найти его.

Вот и мой полный код (я понимаю, что в моем коде могут быть некоторые очень нечистые части, я еще ничего не могу почистить)

import java.io.*;
import java.util.*;

public class FooBar
{
  public static String[][] loadCSV()
  {
    FileInputStream inStream;
    InputStreamReader inFile;
    BufferedReader br;
    String line;
    int lineNum, tokNum, ii, jj;
    String [][] CSV, TempArray, TempArray2;

    lineNum = tokNum = ii = jj  = 0;
    TempArray = new String[50][50];

    try
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Please enter the file path of the CSV");
        String fileName = in.readLine();
        inStream = new FileInputStream(fileName);
        inFile = new InputStreamReader(inStream);
        br = new BufferedReader(inFile);
        StringTokenizer tok,tok2;


        lineNum = 0;
            line = br.readLine();
            tokNum = 0;
            tok = new StringTokenizer(line, ",");

            while( tok.hasMoreTokens())
            {
                TempArray[tokNum][0] = tok.nextToken();
                tokNum++;
            }
            tokNum = 0;
            lineNum++;

            while( line != null)
            {
                    line = br.readLine();
                    if (line != null)
                    {
                        tokNum = 0;
                        tok2 = new StringTokenizer(line, ",");

                        while(tok2.hasMoreTokens())
                        {
                            TempArray[tokNum][lineNum] = tok2.nextToken();
                            tokNum++;
                        }
                    }
                    lineNum++;
            }
    }    
    catch(IOException e)
    {
        System.out.println("Error file  may not be accessible, check the path and try again");
    }

    CSV = new String[tokNum][50];
    for (ii=0; ii<tokNum-1 ;ii++)
    {
        System.arraycopy(TempArray[ii],0,CSV[ii],0,TempArray[ii].length);
    }
    return CSV;
}    
public static void main (String args[])
{
    String [][] CSV;
    CSV = loadCSV();
    System.out.println(Arrays.deepToString(CSV));
}
}                

Файл CSV выглядит следующим образом

Height,Weight,Age,TER,Salary
163.9,46.8,37,72.6,53010.68
191.3,91.4,32,92.2,66068.51
166.5,51.1,27,77.6,42724.34
156.3,55.7,21,81.1,50531.91

Очевидно, он может быть любого размера, но это всего лишь пример файла.

Мне просто нужно изменить размер массива, чтобы он не содержал нулевых значений.

Я также понимаю, что список будет лучшим вариантом, но это невозможно из-за внешних ограничений. Это может быть только многомерный массив.

3 ответа

Решение

Я думаю, что вам нужно 3 изменения в вашей программе

  • После вашего while петля lineNum будет на 1 больше, чем количество строк в файле, поэтому вместо объявления CSV в String[tokNum][50] объявить это как CSV = new String[tokNum][lineNum-1];
  • tokNum будет количество полей в строке, поэтому ваше условие для цикла должно быть ii<tokNum скорее, чем ii<tokNum-1
  • Последний параметр для вашего arraycopy должно быть lineNum-1

т.е. модифицированный код для создания вашего CSV массив это:

CSV = new String[tokNum][lineNum-1];
for (ii=0; ii<tokNum ;ii++)
{
    System.arraycopy(TempArray[ii],0,CSV[ii],0,lineNum-1);
}

и результат будет тогда:

[[Height, 163.9, 191.3, 166.5, 156.3], [Weight, 46.8, 91.4, 51.1, 55.7], 
[Age, 37, 32, 27, 21], [TER, 72.6, 92.2, 77.6, 81.1],
[Salary, 53010.68, 66068.51, 42724.34, 50531.91]]

Обратите внимание, что вам не нужно обрабатывать первую строку файла отдельно от других, но это то, что вы можете охватить как часть вашей очистки.

10 к 1 это домашнее задание. Тем не менее, похоже, что вы вложили в это какую-то мысль.

Не делайте переменную TempArray. Составьте "Список списка строк". Что-то вроде:

List<List<String>> rows = new ArrayList<ArrayList<String>>();

while(file.hasMoreRows()) {            //not valid syntax...but you get the jist
  String rowIText = file.nextRow();    //not valid syntax...but you get the jist
  List<String> rowI = new ArrayList<String>(); 

  //parse rowIText to build rowI --> this is your homework

  rows.add(rowI);

}

//now build String[][] using fully constructed rows variable

Вот наблюдение и предложение.

Замечание: Работа с (многомерными) массивами в Java затруднена.

Предложение: не используйте массивы для представления сложных типов данных в Java.

Создайте классы для ваших данных. Создать список людей:

class Person {
    String height;  //should eventually be changed to a double probably
    String weight;  // "
    //...

    public Person( String height, String weight /*, ... */ ) {
       this.height = height;
       this.weight = weight;
       //...
    }
}

List<Person> people = new ArrayList<Person>();
String line;
while ( (line = reader.nextLine()) != null ) {
    String[] records = line.split(",");
    people.add(new Person (records[0], records[1] /*, ... */));
}
Другие вопросы по тегам