文本文件中的分割线由*分隔成各种列表Java

时间:2018-04-04 17:13:09

标签: java java.util.scanner

在表单上有一个文本文件:

* A
line
line
line
* B
line
* C
line
line

每个*之间的行数是随机的。

我将文本文件读入带有while循环的链表,但是 我不确定如何将A和B之间的行放入A的列表中 B和C之间的行进入B的列表,依此类推。

我尝试过的事情

Linkedlist<String> lines = new Linkedlist<String>();
Linkedlist<String> linesA = new Linkedlist<String>();

while(file.hasNext()){
    lines.add(file.nextLine());  
}

for(String s : lines){
    if(s.contains("*") && s.contains("A")) {
        continue; //dont want this line into the list for A
    } else {
        linesA.add(s); 
        // this works for first part, but what should I do when I reach
        // the next *
    }
}

2 个答案:

答案 0 :(得分:2)

您可以创建列表地图,其中键是组的字母(例如AB等),值是与列表对应的行列表组。例如:

Map<String, List<String>> groups = new HashMap<>();
List<String> currentList = null;

for (String s: lines) {

    if(s.startsWith("*")) {
        String groupName = s.substring(2);
        currentList = new LinkedList<>();
        groups.put(groupName, currentList);
    } 
    else if (currentList != null) {
        currentList.add(s);
    }
}

如果打印groups,结果为:

{A=[line, line, line], B=[line], C=[line, line]}

s.substring(2)只是从组名的头部删除*,以便将* A缩减为A。要获取列表A,只需在get地图上执行groups

groups.get("A")

答案 1 :(得分:1)

如果您要删除命名约定linesAlinesB等,并使用展开的List<List<String>>列表来存储您可以执行以下操作的结果:

List<List<String>> result = new LinkedList<>();
List<String> current = null;
for (String s : lines) {
  if (s.startsWith("*")) {
    current = new LinkedList<>();
    result.add(current);
  } else {
    current.add(s);
  }
}

上面假设格式良好的输入。它相当于:

List<String> linesA = result.get(0);
List<String> linesB = result.get(1);
...