JAVA从具有未知行数的文件中填充2D数组

时间:2013-12-19 09:08:36

标签: java arrays

我正在试图弄清楚如何制作一个从文本文件中读取数据的程序,并用它填充Jtable,我需要能够搜索表格,然后用号。

文本文件中的一行包含:

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();
    }
}

5 个答案:

答案 0 :(得分: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();
    }

}

答案 1 :(得分:0)

您创建一个包含0行的数组,然后尝试访问空数组维。 此外,我想你应该在计算行数后重置扫描仪的指针。 ArrayList应该对您的目标更有用。

答案 2 :(得分:0)

  

class 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

  

public static void main(String [] 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比数组更强大,因为你可以对它们执行各种操作,例如排序和搜索,当然你不必担心它们的初始大小,因为它们只是在你添加新的时候增长元件。

答案 3 :(得分: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;
}

请注意,您可以使用某些第三方库(如Commons IO)来读取文件的行:

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

更少的代码=更少的错误!

希望有所帮助

答案 4 :(得分:0)

移动此行

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

    是System.out.print(行);

但是根据上面的答案,我们建议在可能的情况下更改代码以使用数组列表。