[英]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()
檢查嗎?
您需要確保這里發生了兩件事。
equals
和hashcode
函數。 indexOf()
代替 如果您發布更多代碼,我相信我們可以提供更多幫助。
您是否在要添加到列表的類中實現了equals()
和hashcode()
?
聽起來像是標准的深層/淺層復制問題,以及您正在比較的內容-ArrayList中對象的地址或值。 確定並遵循其他人關於equals和hashCode覆蓋的建議
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.