我有一些包含某些元素的链接列表。
{ (?i), \\d+, \\., \\d+, (?i), \\d+, \\. }
现在,在迭代时,我需要找出三个连续值是否为"\\d+", "\\.", "\\d+"
,如果是,我需要将它们合并到一个值为"\\d+\\.\\d+"
的节点中。因此,在上述操作之后,我之前的列表应该如下所示。
{(?i), \\d+\\.\\d+, (?i), \\d+, \\.}
但是,由于java没有公开链表的内部节点类,所以我无法一次向前看多个节点。我可以使用以下代码,但它看起来很难看。我想知道是否有任何干净的方法来实现同样的目标。
LinkedList<String> l = new LinkedList<>(); //this can be ArrayList aswell.
l.add("(?i)");
l.add("\\d+");
l.add("\\.");
l.add("\\d+");
l.add("(?i)");
l.add("\\d+");
l.add("\\.");
System.out.println(l.toString());
List<Integer> indexesToBeRemoved = new ArrayList<>();
for (int i = 0; i < l.size(); i++) {
int j = i;
if ("\\d+".equals(l.get(j))) {
j++;
if (j < l.size() && "\\.".equals(l.get(j))) {
j++;
if (j < l.size() && "\\d+".equals(l.get(j))) {
l.set(i, "\\d+\\.\\d+");
indexesToBeRemoved.add(j);
indexesToBeRemoved.add(--j);
}
}
}
}
for (int i : indexesToBeRemoved) {
l.remove(i);
}
System.out.println(l.toString());
O/P:
[(?i), \d+, \., \d+, (?i), \d+, \.]
[(?i), \d+\.\d+, (?i), \d+, \.]
答案 0 :(得分:3)
List.subList
是你的朋友,请使用它。
List<String> pattern = Arrays.asList("\\d+", "\\.", "\\d+");
for(int i=0; i<=l.size()-pattern.size(); i++) {
List<String> subList = l.subList(i, i+pattern.size());
if(subList.equals(pattern)) {
subList.clear();
subList.add("\\d+\\.\\d+");
}
}
System.out.println(l);
答案 1 :(得分:1)
如果您使用LinkedList,则需要使用迭代器而不是索引,因为get(n)是O(n)操作。由于您希望能够向后移动,因此必须从listIterator()函数中获取ListIterator。
for(ListIterator<String> i = l.listIterator(); i.hasNext();){
String element = i.next();
if(element.equals("\\d+") && i.hasNext()) {
if(i.next().equals("\\.") && i.hasNext()) {
if(i.next().equals("\\d+")) {
i.remove();
i.previous();
i.remove();
i.previous();
i.set("\\d+\\.\\d+");
} else {
i.previous();
i.previous();
}
} else {
i.previous();
}
}
}
这可能会被清理并使其更加通用,但ListIterator是您在使用链接列表时应该使用的工具。