簡體   English   中英

Java ArrayList問題

[英]Java ArrayList question

我有一個名為A的arrayList,這是非空的。

我創建另一個arrayList B,並放入A的某些元素。

for(someobject obj : A){
                   if(some_condition_is_met)
                             B.add(obj);
}

然后,我對B進行一些處理(不要修改,改組或從中刪除對象。我選擇B的元素,例如B.get(i)

現在,我想找到B.get(i)在A中的位置。

我試過了

for(someobject obj : A){
                   if(obj.equals(B.get(i))
                             return A.lastIndexOf(obj);
}
return null;

但這一直返回null。 也就是說,“等於”與對象不匹配。

所以令我沮喪的是:

return A.get(A.lastIndexOf(B.get(i));

這導致ArrayINdexOutOfBounds異常。

有什么想法我應該做什么? 我感覺到我缺少明顯的東西。 還有一點-這是對我正在做的事情的非常簡單的解釋。 在上面的示例中,創建B似乎毫無意義,但這是必要的。

回答問題:

1)對象是自定義對象。 啊,...我沒有超越平等。 可能就是這樣。

2)我可以確定B中的任何對象都在A中的B中,因為在創建B時,我首先從中刪除了所有對象,以防萬一,然后我僅從A中添加了對象,並且一次都沒有篡改B中的對象。

您在第二個代碼塊中從哪里得到i ,並且是否根據B的大小對其進行檢查?

for(someobject obj : A){
                   if(obj.equals(B.get(i))
                             return A.lastIndexOf(obj);
}
return null;

當您return A.get(A.lastIndexOf(B.get(i));並得到ArrayIndexOutOfBounds時, i的值是B的大小是多少?

填充A和B之后,請執行此簡單測試,以檢查它們是否具有期望值...

for (Object o : B)
{
    System.out.println(A.lastIndexOf(o));
}

如果在此階段遇到問題,則可能在構造對象時遇到問題。 還要確保您沒有在任何地方吞下異常。

您嘗試做的原則應該有效。 我可以說一點一點,那就是執行FOR循環來搜索A以從B查找對象的實例,然后對其執行lastIndexOf毫無意義。 無論如何,lastIndexOf將遍歷A。 您正在尋找某種東西,然后當您找到它時,您只是將其留在原處,然后重新尋找它。 (不可否認,您的第一個搜索是從A的開頭開始,而lastIndexOf則是從結尾開始搜索。因此,這就像從地下室開始尋找您的車鑰匙,一直到閣樓。然后找到它們時,就把它們留在那里了,然后轉到閣樓,然后再次開始搜索,一直到地下室。)

我懷疑問題不在於概念,而在於細節。 您可能會顯示實際代碼。 如果代碼太復雜,請嘗試將其簡化為基本內容,然后查看錯誤是否仍然發生。

一種可能性:您是否真的將對象從A直接添加到B? 還是要為B創建一個新對象,它是A的對象的副本? 如果是后者,那么除非您重寫equals()否則它是行不通的,因為用戶定義對象的默認equals()只會檢查它們是否是相同的實例,而不是“等效”對象。

覆蓋對象中的equals()和hashcode()方法

@Override
public boolean equals(Object o) {
    boolean result = false;
    if (o instanceof Someobject ) {
        Someobject other = (Someobject ) o;
        result = attribute.equalsIgnoreCase(other.attribute);
    }
    return result;
}

@Override
public int hashCode() {
    return attribute.hashCode();
}

似乎B包含與A不同的對象。您確定equals方法在您的對象中正確嗎? 而且您還沒有修改B(或A)中的對象?

some_condition_is_met是否可能始終為false 如果是這樣,這將很好地解釋整個用例-除了B.get(i) ,無論i是什么, B.get(i)總是返回IndexOutOfBoundsException

因此,在運行第一個循環之后,您可以嘗試B.isEmpty()檢查嗎?

您需要確保這里發生了兩件事。

  1. 正確編寫對象equalshashcode函數。
  2. 采用 。 indexOf()代替

如果您發布更多代碼,我相信我們可以提供更多幫助。

您是否在要添加到列表的類中實現了equals()hashcode()

聽起來像是標准的深層/淺層復制問題,以及您正在比較的內容-ArrayList中對象的地址或值。 確定並遵循其他人關於equals和hashCode覆蓋的建議

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM