Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在遍历java列表时查看前面的“n”元素?_Java_List_Iteration - Fatal编程技术网

如何在遍历java列表时查看前面的“n”元素?

如何在遍历java列表时查看前面的“n”元素?,java,list,iteration,Java,List,Iteration,我有一个包含一些元素的链表 { (?i), \\d+, \\., \\d+, (?i), \\d+, \\. } 现在,在迭代过程中,我需要确定三个连续值是否为\\d+,\\,\\d+,如果是,我需要将它们合并到一个值为\\d+\.\\d+的节点中。因此,在上述操作之后,我之前的列表应该如下所示 {(?i), \\d+\\.\\d+, (?i), \\d+, \\.} 但是,由于java不公开链表的内部节点类,所以我无法一次查看多个节点。我可以用下面的代码让它工作,但我觉得它很难看。我想知

我有一个包含一些元素的链表

 { (?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+, \.]
这是你的朋友,用它吧

 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);

如果要使用LinkedList,则需要使用迭代器而不是索引,因为getn是一个On操作。由于您希望能够返回,因此必须从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是处理链表时应该使用的工具。

没有使用ArrayList的选项吗?因为你在那里indexing@SacJn没什么区别。LinkedList也有索引。是的,它有索引,但不如ArrayList有效。因此,LinkedList上的任何操作都比其计数器消耗更多的时间part@SacJn是的,我知道。但是你之前的评论是模棱两可的,因为LinkedList没有索引。我的意思是,即使你可以通过调用getindex从LinkedList获得一个元素,那也不是真正意义上的索引用法。总之,用简短的文字写出来可能听起来模棱两可我真的很喜欢这个解决方案,但如果你能改变硬编码的东西,比如:i@Tagir瓦列夫。天才谢谢你的回答。@Flown,pattern.size-同意,已编辑。String.join是Java-8功能当前的解决方案是Java-5兼容的,在一般情况下,它可能并不总是应该被连接模式列表替换,因此我将这部分保持原样。@Tagirvalev同意。这是Java8的一个特性。实际上,我也同意Arraylist。但是,对LinkedList来说,你的答案更有意义。