说,我有两个对LinkedList List1中的Object的引用:
LinkedList<Object> List1 = new LinkedList<Object>();
Object first;
Object last;
我不想使用这些对象的列表索引来引用它们,因为我的列表长度发生了变化。我认为这不会奏效。 现在我想迭代第一个和最后一个定义的子列表,其中首先定义List1中子列表的开头,最后定义List1中子列表的结尾。
我现在的问题是AFAIK我不能做像
这样的事情while (current != last){
// do something
current = someiterator.next();
}
因为我正在比较通常指向不同位置的两个对象。此外,我也无法通过它们的值来比较引用,因为列表可能有一个值出现多次。 那么如何遍历List1的子列表?
答案 0 :(得分:6)
您可以使用类似
的内容list1.sublist(list1.indexOf(first), list1.indexOf(last))
好的,我想我现在更了解你的问题。上述方法将使用.equals
方法,因此不能比较引用。这可能是一个更好的解决方案:
import java.util.*;
public class Test {
public static void main(String[] args) {
String first = "beta";
String last = "delta";
List<String> list1 = new LinkedList<String>();
list1.add("alpha");
list1.add(first);
list1.add("gamma");
list1.add(last);
list1.add("epsilon");
boolean firstFound = false;
for (String s : list1) {
if (firstFound || (firstFound = s == first))
System.out.println(s);
if (s == last)
break;
}
}
}
答案 1 :(得分:4)
不,您的比较while (current != last)
可以正常使用。在Java中,对象存在于堆上,您只能使用引用。使用==
比较两个引用会返回true
iff它们引用相同的对象,这似乎正是您想要的。
答案 2 :(得分:0)
如果您既不能依赖==也不能依赖.equals(),我看不出您如何定义子列表......
答案 3 :(得分:0)
您应该使用Object.equals()来比较您的对象。如果你的对象是真实的对象而不是原始的或字符串(如果它们的值等于它们则相等)你应该能够这样做:
boolean start = false;
for(Object o : list){
if(o.equals(first){
start = true;
}else if(o.equals(last)){
break;
}
if(start){
// do something
}
}
或者更确切地说使用aioobe的答案
答案 4 :(得分:0)
一种方法是不直接添加对象,而是创建包装器,因此您将拥有
List<WrapperObject<Object>> aList = new LinkedList<WrapperObject<Object>>();
现在,您可以通过检查包装器而不是包装对象来验证条目的相等性。