在表单上有一个文本文件:
* 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 *
}
}
答案 0 :(得分:2)
您可以创建列表地图,其中键是组的字母(例如A
,B
等),值是与列表对应的行列表组。例如:
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)
如果您要删除命名约定linesA
,linesB
等,并使用展开的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);
...