LinkedList-遍历时获取当前和上一个

时间:2018-08-12 02:44:30

标签: java list iteration

我有一个LinkedList,并且在迭代时需要知道当前,上一个和下一个项目。我想没有办法用“ for each”表示法来做到这一点,所以我转向列出迭代器。事实证明,它们相当令人困惑。

无论如何,我已经实现了一个可以跟踪当前,上一个和下一个内容的实现。

    LinkedList<String> list = new LinkedList<String>();

    list.add("p");
    list.add("r");
    list.add("r");
    list.add("q");
    list.add("p");
    list.add("p");
    list.add("r");

    String prev = "";
    String next = "";
    String curr = "";
    Boolean firstRun = true;

    ListIterator<String> li = list.listIterator();

    while (li.hasNext()) {
        curr = li.next();

        if (firstRun) {
            prev = "-";
            firstRun = false;
        } else if (li.hasPrevious()) {
            prev = li.previous();
            li.next();
            if (li.hasNext())
                curr = li.next();
        } else
            prev = "-";

        if (li.hasNext()) {
            next = li.next();
            li.previous();
            if (li.hasPrevious())
                curr = li.previous();
        } else
            next = "-";

        System.out.println(curr + prev + next);
    }

此输出

p-r
rpr
rrq
qrp
pqp
ppr
rp-

我想知道是否有更简单的方法可以做到这一点。代码很混乱,而且不直观,至少我是怎么解释的。

编辑:我已经抽象出了我要解决的实际问题。除了字符串,我还有一个对象列表,例如:

public foo(String name, String data) {
    this.name = name;
    this.data = data
}

如果foo.name是“ alone”,即下一个和上一个项目不同,我想跟踪foo.data

如果重复foo.name,那么我想跟踪foo.data的第一个和最后一个实例,相对于它周围的项目。

list.add(new foo("ben", "clock");
list.add(new foo("Joe", "paper");
list.add(new foo("Joe", "pen");
list.add(new foo("Joe", "pencil");
list.add(new foo("greg", "couch");
list.add(new foo("sam", "desk");
list.add(new foo("sam", "book");
list.add(new foo("Joe", "earbuds");
list.add(new foo("Joe", "sail");
list.add(new foo("Joe", "watch");

通过此列表,我们感兴趣:

clock, paper, pencil, couch, desk, book, earbuds, watch

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您似乎使其过于复杂。您知道前一个对象,因为您刚过去。实际上,“当前”对象也是“下一个”对象之前的对象,因此,如果您仅记住迭代过程中的最后3个项目,那么您就可以在其中找到“上一个”,“当前”和“下一个”。

LinkedList<String> list = new LinkedList<>(Arrays.asList("p", "r", "r", "q", "p", "p", "r"));

String prev = null;
String curr = null;
String next = "-";
for (String value : list) {
    prev = curr;
    curr = next;
    next = value;
    if (prev != null)
        System.out.println(curr + prev + next);
}
prev = curr;
curr = next;
next = "-";
System.out.println(curr + prev + next);

输出

p-r
rpr
rrq
qrp
pqp
ppr
rp-

或者,如果您不喜欢循环后的额外步骤:

LinkedList<String> list = new LinkedList<>(Arrays.asList("p", "r", "r", "q", "p", "p", "r"));

String prev = null, curr = "-", next = null;
for (Iterator<String> iter = list.iterator(); prev == null || ! "-".equals(next); prev = curr, curr = next) {
    next = (iter.hasNext() ? iter.next() : "-");
    if (prev != null)
        System.out.println(curr + prev + next);
}

相同的输出。


关于您的真实逻辑...

  

如果foo.name是“单独的”,即下一个和上一个项目不同,我想跟踪foo.data

     

如果重复foo.name,那么我想跟踪foo.data的第一个和最后一个实例,相对于它周围的项目。

这实际上意味着您要跟踪条纹,即具有相同name的一系列值,跟踪第一项和最后一项以及条纹长度。

public static void main(String[] args) {
    LinkedList<Foo> list = new LinkedList<>(Arrays.asList(
            new Foo("ben", "clock"),
            new Foo("Joe", "paper"),
            new Foo("Joe", "pen"),
            new Foo("Joe", "pencil"),
            new Foo("greg", "couch"),
            new Foo("sam", "desk"),
            new Foo("sam", "book"),
            new Foo("Joe", "earbuds"),
            new Foo("Joe", "sail"),
            new Foo("Joe", "watch")
    ));

    String streakName = null;
    int streakLength = 0;
    String firstData = null;
    String lastData = null;
    for (Foo foo : list) {
        if (! foo.getName().equals(streakName)) {
            if (streakLength != 0)
                processStreak(streakName, streakLength, firstData, lastData);
            streakName = foo.getName();
            streakLength = 0;
            firstData = foo.getData();
        }
        streakLength++;
        lastData = foo.getData();
    }
    if (streakLength != 0)
        processStreak(streakName, streakLength, firstData, lastData);
}
private static void processStreak(String name, int length, String firstData, String lastData) {
    if (length == 1)
        System.out.println("Alone: name=" + name + ", data=" + firstData);
    else
        System.out.println("Repeated: name=" + name + ", first=" + firstData + ", last=" + lastData);
}

输出

Alone: name=ben, data=clock
Repeated: name=Joe, first=paper, last=pencil
Alone: name=greg, data=couch
Repeated: name=sam, first=desk, last=book
Repeated: name=Joe, first=earbuds, last=watch