2010-12-16 166 views
0

說鏈表,我有一個LinkedList列表1到對象兩個引用:迭代通過在Java中

LinkedList<Object> List1 = new LinkedList<Object>(); 
Object first; 
Object last; 

我不想使用這些對象的列表索引引用它們,因爲我的列表長度發生變化。我認爲這是行不通的。 現在我想遍歷由第一個和最後一個定義的子列表,其中首先定義List1中子列表的開始,最後定義List1中子列表的結束。現在

我的問題是,據我所知,我不能這樣做

while (current != last){ 
// do something 
current = someiterator.next(); 

} 

,因爲我比較的兩個對象,一般會指向不同的位置。此外,我也無法比較引用的價值,因爲列表可能有多次出現的值。 那麼如何迭代List1的子列表呢?

回答

4

無,您的比較while (current != last)將正常工作。在Java中,對象位於堆上,只能使用引用。如果使用==比較兩個引用,則返回true,如果它們引用同一個對象,這看起來正是你想要的。

+0

好吧,所以如果我做一些像 last = List1.get(2),然後再比較最後一個迭代器,比如「while(current!= last)」,那麼比較應該比較我真正想要的兩個對象比較? – ptikobj 2010-12-16 15:27:58

+0

我覺得有些東西我沒有意識到:如果你做了類似 對象a = b; 然後a將持有_reference_對象b,對吧? 因爲a擁有對b的引用,所以在(a!= current)時,我可以執行類似 的操作。 最初,我認爲a = b會將b的_object_或_value_賦值給a。但是,如果b是基元,則該值只會分配給a。如果b是一個對象,那麼a只會保持b的引用。 感謝您的所有答案,我想我現在明白了。 – ptikobj 2010-12-16 15:41:26

+0

@ptikobj:該對象並沒有真正的名字。 「a」和「b」都不是「對象」。相反,* both *保存對該對象的引用,因此與'==' – 2010-12-16 15:47:25

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; 
     } 
    } 
} 
+0

好吧,但由於第一個和最後一個實際上是對象(沒有原始類型),list1.indexOf(first)應該返回我分配給它的「第一個」對象(在其他一些方法中)。它肯定會返回「正確的」「第一個」對象嗎? – ptikobj 2010-12-16 15:24:42

+0

不知道我理解你的評論。 – aioobe 2010-12-16 15:27:45

+0

事情是,indexOf(someobject)返回List1中某個對象的_first_事件。然而,在我的情況下,可能有幾個具有相同值的對象。由於我是Java新手,我的問題是: 確實Java將這些對象與不同的對象具有相同的值嗎? – ptikobj 2010-12-16 15:32:46

0

如果你不能依靠既不==也不.equals(),我不知道你怎麼可能定義一個子表...

+0

我的意思是,我實際上想要的是像第一個指針(如C++中的)和指向最後一個的指針。這些指針應該保持不變,並且仍然指向我首先分配給它們的元素。 – ptikobj 2010-12-16 15:26:21

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

0

的一種方法,答案是不直接添加的對象,而是要創建一個包裝,所以你必須

List<WrapperObject<Object>> aList = new LinkedList<WrapperObject<Object>>(); 

現在,您可以通過檢查包裝,而不是包裹對象驗證的平等。