Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将txt文件读取到未知大小的ArrayList_Java_Arraylist - Fatal编程技术网

Java 如何将txt文件读取到未知大小的ArrayList

Java 如何将txt文件读取到未知大小的ArrayList,java,arraylist,Java,Arraylist,如何读取具有未知大小行的txt文件?例如: Family1,john,mark,ken,liam Family2,jo,niamh,liam,adam,apple,joe 每行都有不同数量的名称。我可以在使用对象类型时读入,如 family(parts[0], parts[1], parts[2]) 但是如果我知道每一个的数量的话。我如何在不知道每本书有多少册的情况下阅读 FileReader fr = new FileReader("fam.txt"); Buffere

如何读取具有未知大小行的txt文件?例如:

Family1,john,mark,ken,liam

Family2,jo,niamh,liam,adam,apple,joe
每行都有不同数量的名称。我可以在使用对象类型时读入,如

 family(parts[0], parts[1], parts[2]) 
但是如果我知道每一个的数量的话。我如何在不知道每本书有多少册的情况下阅读

FileReader fr = new FileReader("fam.txt");
       BufferedReader br = new BufferedReader(fr);
       String fileLines;
       String[] parts;    
        while(br.ready())
        {
          fileLines = br.readLine();
          parts = fileLines.split(",");
          .
          .

由于您试图将数据加载到一个
字符串[]
,而该字符串又是一个普通数组,因此您一直在挣扎。您应该使用维护内部数组并动态增加其大小的
ArrayList

FileReader fr = new FileReader("fam.txt");
BufferedReader br = new BufferedReader(fr);
String fileLines;
String[] parts;   
List<List<String>> data = new ArrayList<>(); 
while(br.ready()) {
    fileLines = br.readLine();
    parts = fileLines.split(",");
    data.add(Arrays.asList(parts));
    //do what you want/need...
}
//do what you want/need...

您可以对
family()
方法使用varargs来接受数组:
family(String…parts)
或者只使用
family(String[]parts)

就我个人而言,我会创建一个单独的类
,并且不会因为文件格式的实现细节(即每行的第一项是族名称)而污染它:

公共类族{
私有最终列表成员=新ArrayList();
私有最终字符串familyName;
公共族(字符串familyName,集合成员){
this.familyName=familyName;
this.members.addAll(成员);
}
}
然后,您的循环可以如下所示:

List<Family> families = new ArrayList<>();

String line;
while ((line = br.readLine()) != null) {
   List<String> parts = Arrays.asList(line.split(","));
   String familyName = parts.remove(0);
   families.add(new Family(familyName, parts));
}
List families=new ArrayList();
弦线;
而((line=br.readLine())!=null){
列表部分=Arrays.asList(line.split(“,”);
字符串familyName=部件。删除(0);
添加(新族(familyName,parts));
}
:可调整大小的
列表
接口数组实现。实现所有可选的列表操作,并允许所有元素(包括
null
)提供操作内部用于存储列表的数组大小的方法

每个
ArrayList
实例都有一个
容量
:用于存储列表中元素的数组大小。它始终至少与列表大小一样大。当元素添加到
阵列列表中时,其容量会自动增长。除了添加要素具有恒定的摊余时间成本这一事实之外,没有详细说明增长政策


因此,只需读取您的数据并使用
ArrrayList.add(E)
方法添加到数组列表中。

我个人的偏好是使用Scanner类。您可以查看功能。使用扫描仪,您可以一次解析一行文件,并将这些值存储到字符串中

Scanner scan = new Scanner(new File("fam.txt"));
List<String> families = new ArrayList<String>();
while(scan.hasNextLine()){
   families.add(scan.nextLine());
}
Scanner scan=新的扫描仪(新文件(“fam.txt”);
列表族=新的ArrayList();
while(scan.hasNextLine()){
families.add(scan.nextLine());
}

然后,您可以对ArrayList中的族执行任何操作,使用扫描仪更容易。你可以把两者都放在一个while循环中

Scanner sc = new Scanner(new File(myFile.txt));
while(sc.hasNextLine()) {
  while(sc.hasNextString()) {
    String str = sc.nextString();
  }
}

这是一个简化版本,无法正常工作,因为您必须在变量中存储一些值,以便Java正确读取它们。阅读Java Scanner上的文档以找到更详细的解释。扫描器比您一直在做的要简单得多

ArrayList会代替List吗?还有.asList会做些什么呢?@Juan 1),而且它会比
List
更好,因为您将每个数据存储在
String[/code>部分中,所以它比
List
更易于维护。2) .你的编码方式有什么问题?最后,应该使用输入行中的标记填充parts[]数组。如果不知道你要解决的问题是什么,你很难推荐任何东西。。。
Scanner scan = new Scanner(new File("fam.txt"));
List<String> families = new ArrayList<String>();
while(scan.hasNextLine()){
   families.add(scan.nextLine());
}
Scanner sc = new Scanner(new File(myFile.txt));
while(sc.hasNextLine()) {
  while(sc.hasNextString()) {
    String str = sc.nextString();
  }
}