2013-12-19 56 views
1

我想弄清楚如何使一個程序從文本文件中讀取數據,並填充Jtable,我需要能夠搜索表格,並用數字做一些計算。JAVA從一個文件中填充未知數量的行的2D數組

在文本文件中的一行將包含:

name, country, gender, age, weight 

行數是未知的(我需要計算的行數)。 這是我試過的,但它似乎崩潰。 我需要計算行數,然後用行中的內容填充數組。

package Jone; 
import java.io.*; 
import java.util.*; 


public class Jone { 
    public static void main (String [] args)throws IOException{ 
     int rows = 0; 

     Scanner file = new Scanner (new File("data.txt")); 
     while (file.hasNextLine()){rows++;} 
     Object[][] data = new Object[rows][5]; 
     System.out.print(rows); 
     file.nextLine(); 
     for(int i = 0;i<rows;i++) 
     { 
      String str = file.nextLine(); 
      String[] tokens= str.split(","); 
      for (int j = 0;j<5;j++) 
      { 
       data[i][j] = tokens[j]; 

       System.out.print(data[i][j]); 
       System.out.print(" "); 
      }   
     } 
     file.close(); 
    } 
} 
+8

這時候,是['ArrayList's(http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)閃耀。 – Maroun

+0

有什麼問題?你可以從一個大數組開始(rows = 1000)或者使用一個動態存儲器(look @MarounMaroun); –

+0

@MartinFrank實際上有一個問題,但它有點不清楚,user3118416,可以請你的問題更精確一點。突出了你的問題。 – Tafari

回答

1

更改您的代碼如下

package Jone; 
import java.io.*; 
import java.util.*; 


public class Jone { 
    public static void main (String [] args)throws IOException{ 
     try{ 
    int rows = 0; 
    Scanner file = new Scanner (new File("data.txt")); 
    while (file.hasNextLine()) 
    { 
     rows++; 
     file.nextLine(); 
    } 

    file = new Scanner (new File("data.txt")); 
    System.out.println(rows); 
    Object[][] data = new Object[rows][5]; 
    for(int i = 0;i<rows;i++) 
    { 
     String str = file.nextLine(); 
     String[] tokens= str.split(","); 
     for (int j = 0;j<5;j++) 
     { 
      data[i][j] = tokens[j]; 
      System.out.print(data[i][j]); 
      System.out.print(" "); 
     }   
    } 
    file.close(); 
      } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 
0

您創建一個0行的數組,然後嘗試訪問空數組維度。 另外我想你應該在計算行數後重置掃描器的指針。 ArrayList應該對你的目標更有用。

0

類Person {

String name, country, gender; 
int age; 
double weight; 

public Person(String n, String c, String g, int a, double w) { 

    name = n; 
    country = c; 
    gender = g; 
    age = a; 
    weight = w; 
} 

}

會正確數據更好的模型,當你從文件中提取(我參加了一個猜測Person但叫什麼你會) 。然後,我們使用ArrayList像這樣:

公共靜態無效的主要(字串[] args)拋出IOException異常{

ArrayList<Person> people = new ArrayList<Person>(); 
    Scanner file = new Scanner (new File("data.txt")); 
    while (file.hasNextLine()) { 

    String str = file.nextLine(); 
    String[] tokens= str.split(","); 
    people.add(new Person(tokens[0], tokens[1], tokens[2], 
      Integer.parseInt(tokens[3], Double.parseDouble(tokens[4])))); 
    } 

    file.close(); 
    Person[] arrayPeople = people.toArray(); 

}

ArrayLists是更強大的比列,你可以對它們進行各種操作,比如排序和搜索,當然你不必擔心它們的初始大小,因爲它們隨着添加新元素而增長。

0

Maroun是正確的,你真的需要使用一些類別來幫你:

public static void main(String[] args) throws Exception { 

    List<String[]> lines = readFiles(new File("data.txt")); 
    String[][] data = lines.toArray(new String[0][]); 
} 

public static List<String[]> readFiles(File file) { 
    List<String[]> data = new LinkedList<>(); 

    Scanner scanner = null; 
    try { 
     scanner = new Scanner(file); 
     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      String[] tokens = line.split(","); 
      data.add(tokens); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } finally { 
     scanner.close(); 
    } 

    return data; 
} 

注意,您可以使用一些第三方的庫,例如共享IO讀取文件的臺詞:

List<String> lines = org.apache.commons.io.FileUtils.readLines(new File("data.txt"));) 

代碼較少=錯誤較少!

希望它能幫助

0

移動這一行

Object[][] data = new Object[rows][5]; 

下面 是System.out.print(行);

但是根據上面的答案,我們建議在可能的情況下更改代碼以使用數組列表。