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,请您的问题更精确一点。为您突出显示了这个问题。但这不是解决方案吗?数数行,然后创建数组并填充它(您在文件中迭代了两次,但谁知道呢?不使用集合可能是有原因的)