我正在尝试用Java对LinkedList
进行排序。我需要从后到前经过mylist
。列表中的元素是我的班级CustomElement
中的对象。如果它们符合某种模式,我想把它们放在前面。
我的问题是,如果我检测到我的列表中的索引为5的元素与我的模式匹配并将其移动到索引0,那么索引为4的前一个元素现在具有索引5,对吧?这就是为什么我希望for循环再次检查索引为5的元素:i++
。但是这导致了一个无限循环,即方法在没有i++
的情况下正常工作,但不是我想要它的方式,因为它正在跳过索引为4的元素(现在为5)。
是否有可能在for循环中引发变量i
?如果是的话,我做错了什么。
for (int i = mylist.size() - 1; i >= 0; i--) {
if (mylist.get(i) matches a certain pattern) {
CustomElement helper = mylist.get(i);
mylist.remove(i);
mylist.add(0, helper);
i++;
}
}
答案 0 :(得分:3)
是的,可以在你的for循环中修改i
,如果不可能,你就不会得到这个无限循环。
必须发生的事情是,如果(mylist.get(i) matches a certain pattern)
在某一点之后继续存在,并且您永远不会达到i >= 0
不正确的点。
因此,如果myList.get(0)
与您的模式匹配,您只需将其放回索引0
,并继续检查它。
答案 1 :(得分:1)
确实如此,但在你的情况下,使用get(i)作为链表会给出二次性能。
如果您不介意按顺序颠倒“匹配”项目,那么您最好创建一个新列表:
final LinkedList<CustomElement> newList = new LinkedList<> ();
for (final CustomElement e: myList)
{
if (e matches your pattern) { newList.addFirst (e); }
else { newList.addLast (e); }
}
myList = newList;
然后索引变量的所有问题都会消失......
(您还可以在修改现有列表时实现线性性能,但这有点复杂。)