-1

如何从行数未知的 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(",");
          .
          .
4

5 回答 5

2

您可以使用 varargs 作为您的family()方法来接受数组: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));
}
于 2013-11-08T19:52:51.080 回答
0

由于您尝试将数据加载到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...
}
于 2013-11-08T19:50:48.647 回答
0

ArrayList<E>: 接口的 Resizable-array 实现List。实现所有可选的列表操作,并允许所有元素,包括null,提供方法来操作内部用于存储列表的数组的大小。

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

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

于 2013-11-08T19:53:52.600 回答
0

使用扫描仪,这更容易。你可以把两者都放在一个while循环中

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

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

于 2013-11-08T20:02:22.133 回答
0

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

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

然后你可以对 ArrayList 中的家庭做任何你想做的事情

于 2013-11-08T19:57:36.183 回答