2010-10-18 3 views
4

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

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

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 

Может потребоваться любой размер, но это всего лишь образец файла.

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

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

+0

При использовании списка не вариант, вы можете иметь динамическую реализацию массива свой собственный, где вы расширить массив, как и в случае необходимости и копирование старых значений в недавно построенном массиве. Или вы можете прочитать файл дважды. Сначала найдите количество строк и столбцов, а во втором читайте, чтобы определить массив, заполните значения в массиве –

ответ

2

Я думаю, вам нужно 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]] 

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

+0

Спасибо, что именно это я пытался сделать, я клянусь, что это то, что я пробовал, было поздно ночью, я могу совершили ошибку и несколько раз пробовали одно и то же. Спасибо, куча, я бы нажал стрелку вверх на ваш ответ, но у меня нет необходимой репутации. – Aaron

+0

@ Аарон Рад, что это помогло. PS. вы можете перенаправить ответы на свои * собственные вопросы независимо от того, сколько у вас репутации. – mikej

2

От 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 
0

Это замечание и предложение.

Наблюдение: Работа с (многомерными) массивами сложна на 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] /*, ... */)); 
} 
+0

Я бы сделал это, однако, я не могу гарантировать, что CSV-файл будет использовать те же заголовки каждый раз, это всего лишь образец CSV с правильным форматированием, я никогда не знаю, что данные могли бы реально провести – Aaron

Смежные вопросы