有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将txt文件读取到未知大小的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");
       BufferedReader br = new BufferedReader(fr);
       String fileLines;
       String[] parts;    
        while(br.ready())
        {
          fileLines = br.readLine();
          parts = fileLines.split(",");
          .
          .

共 (5) 个答案

  1. # 1 楼答案

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

    Scanner scan = new Scanner(new File("fam.txt"));
    List<String> families = new ArrayList<String>();
    while(scan.hasNextLine()){
       families.add(scan.nextLine());
    }
    

    然后可以对ArrayList中的族执行任何操作

  2. # 2 楼答案

    ^{}List接口的可调整大小的数组实现。实现所有可选的列表操作,并允许所有元素(包括null)提供方法来操作内部用于存储列表的数组的大小

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

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

  3. # 3 楼答案

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

    就个人而言,我会创建一个单独的类Family,并且不会因为文件格式的实现细节(即每行的第一项是姓氏)而影响它:

    public class Family {
        private final List<String> members = new ArrayList<>();
        private final String familyName;
    
        public Family(String familyName, Collection<String> members) {
            this.familyName = familyName;
            this.members.addAll(members);
        }
    }
    

    然后,您的循环可以如下所示:

    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));
    }
    
  4. # 4 楼答案

    由于您试图将数据加载到一个String[]而该String[]又是一个普通数组,因此您一直在挣扎。您应该使用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...
    

    更好的方法是解析String[] parts中的数据,并构建某个类的对象,该类将包含特定案例的数据:

    public void yourMethod() {
        FileReader fr = new FileReader("fam.txt");
        BufferedReader br = new BufferedReader(fr);
        String fileLines;
        String[] parts;   
        List<Family> familyList = new ArrayList<>(); 
        while(br.ready()) {
            fileLines = br.readLine();
            parts = fileLines.split(",");
            Family family = new Family(parts[0], parts[1], parts[2]);
            familyList.add(family);
            //do what you want/need...
        }
        //do what you want/need...
    }
    
  5. # 5 楼答案

    用扫描仪,那容易多了。你可以把两者都放在一个while循环中

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

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