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] /*, ... */));
}