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

JAVA从具有未知行数的文件填充2D数组,java,arrays,Java,Arrays,我正在试图找出如何制作一个程序,从文本文件中读取数据,并用它填充Jtable,我需要能够搜索表格,并用数字进行一些计算 文本文件中的一行将包含: name, country, gender, age, weight 行数未知(我需要计算行数)。 这是我尝试过的,但它似乎崩溃了我需要计算行数,然后用行中的内容填充数组 package Jone; import java.io.*; import java.util.*; public class Jone { public stat

我正在试图找出如何制作一个程序,从文本文件中读取数据,并用它填充
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();
    }
}
packagejone;
导入java.io.*;
导入java.util.*;
公务舱{
公共静态void main(字符串[]args)引发IOException{
int行=0;
扫描仪文件=新扫描仪(新文件(“data.txt”);
而(file.hasNextLine()){rows++;}
对象[][]数据=新对象[行][5];
系统输出打印(行);
file.nextLine();

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

班主任{

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
如下:

公共静态void main(字符串[]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();   
ArrayList people=new ArrayList();
扫描仪文件=新扫描仪(新文件(“data.txt”);
while(file.hasNextLine()){
String str=file.nextLine();
字符串[]标记=str.split(“,”);
添加(新人员(令牌[0]、令牌[1]、令牌[2],
Integer.parseInt(令牌[3],Double.parseDouble(令牌[4]));
}
file.close();
Person[]arrayPeople=people.toArray();
}


比数组强大得多,因为你可以对它们执行各种操作,如排序和搜索,当然你不必担心它们的初始大小,因为它们只是随着你添加新元素而增长。

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;
}
publicstaticvoidmain(字符串[]args)引发异常{
列表行=读取文件(新文件(“data.txt”);
字符串[][]数据=行。toArray(新字符串[0][]);
}
公共静态列表读取文件(文件文件){
列表数据=新建LinkedList();
扫描器=空;
试一试{
扫描仪=新扫描仪(文件);
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
String[]tokens=line.split(“,”);
数据。添加(令牌);
}
}catch(filenotfounde异常){
e、 printStackTrace();
}最后{
scanner.close();
}
返回数据;
}
请注意,您可以使用一些第三方库(如Commons IO)来读取文件的行:

List<String> lines = org.apache.commons.io.FileUtils.readLines(new File("data.txt"));)
List lines=org.apache.commons.io.FileUtils.readLines(新文件(“data.txt”);)
更少的代码=更少的bug

希望它能帮助移动这条线

Object[][] data = new Object[rows][5];
下面 系统输出打印(行)


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

更改代码如下

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

}
packagejone;
导入java.io.*;
导入java.util.*;
公务舱{
公共静态void main(字符串[]args)引发IOException{
试一试{
int行=0;
扫描仪文件=新扫描仪(新文件(“data.txt”);
while(file.hasNextLine())
{
行++;
file.nextLine();
}
文件=新扫描仪(新文件(“data.txt”);
系统输出打印项次(行);
对象[][]数据=新对象[行][5];

对于(int i=0;这是发光的时候。问题是什么?你可以从一个大数组(行=1000)开始,或者使用一个动态存储(look@maroun)@MartinFrank实际上有一个问题,但有点不清楚,user3118416,请您的问题更精确一点。为您突出显示了这个问题。但这不是解决方案吗?数数行,然后创建数组并填充它(您在文件中迭代了两次,但谁知道呢?不使用集合可能是有原因的)