[英]how to iterate an ArrayList of objects and to access a method of that class to which the object belongs while iterating?
我有一個Employee
類,並且在該類中有一個名為getName()
的方法,該方法返回雇員的姓名。 每個員工都有一些屬性(姓名,職位,職務,薪水),我將它們存儲在ArrayList中。
現在,我想編寫一個方法deleteEmployee(String, ArrayList<Employee>)
,該方法會將作為參數給出的字符串與員工姓名進行比較,如果找到匹配項,它將刪除該員工的全部詳細信息。嘗試了以下方法,但出現錯誤,我也不知道如何解決...
public void deleteEmployee (String str,ArrayList <Employee> arr)
{
Employee obj2;
for (int i = 0; i < arr.size(); i++)
{
if(str.equalsIgnoreCase(arr.get(obj2[i].getName())))
arr.remove(obj2[i]);
break;
}
}
您可能有一個ConcurrentModificationException或類似的東西。 那是因為除非使用Iterator,否則您無法修改要迭代的數組
你應該嘗試這樣的事情
Iterator<Employee> it = arr.iterator();
Employee currentEmployee = null;
while(it.hasNext()){
currentEmployee = it.next();
if(currentEmployee.getName().equals(obj2.getName()){
it.remove();
}
}
為了將來幫助解決您的問題,請同時發布您的錯誤和堆棧跟蹤。
如果只有一個與名稱相匹配的項目,則您的方法將起作用。 但是,您的錯誤在這里:
if(str.equalsIgnoreCase(arr.get(obj2[i].getName())))
相反,您需要從數組中獲取對象,然后對結果調用getName:
if(str.equalsIgnoreCase(arr.get(i).getName()))
您還需要在if
塊中break
: if(...) { arr.remove(i); break; }
if(...) { arr.remove(i); break; }
當然,在您的實現中還有其他可以改進的地方。
據我所知,您的代碼存在一些問題。
首先,使用break
並不是很好的做法。 特別是在使用過的地方使用它。 在您的代碼中, if
語句處理完畢,則for
循環結束。 無論if
語句的結果如何, for
循環都不會迭代。 因此,除非您只想檢查所需雇員是否在索引0處,否則這遠非理想。
for (int i = 0; i < arr.size(); i++)
這是第二個問題。 由於使用了break
語句,因此在理想情況下它足夠好工作,但是如果所需的雇員不在ArrayList中,則將獲得IndexOutOfBoundsException
因為在上一次迭代中,您將嘗試獲取該索引。 ArrayList的大小,該大小不存在。 相反,您的for循環應為
for (int i = 0; i < arr.size() - 1; i++)
這樣,如果沒有雇員,則循環將在到達ArrayList的最后一個索引(小於大小的1)時停止。
另一個更直接的問題是以下行:
if(str.equalsIgnoreCase(arr.get(obj2[i].getName())))
在此行中,當您應該使用ArrayList的索引時,您正在使用Employee對象作為參數調用arr.get
。
if(str.equalsIgnoreCase(arr.get(i).getName()))
通過此修改,您可以調用ArrayList的索引,該索引將返回Employee對象。 然后,您在該對象上調用getName()
,它返回字符串,就像您打算做的那樣,將字符串與str
比較是否相等。
最后一個問題是刪除對象的行。
arr.remove(obj2[i]);
同樣,您似乎正在嘗試訪問Employee對象的索引,而不是ArrayList。 將此行更改為:
arr.remove(i);
會更加有效。 這樣,您將刪除數組的索引。 您可以使用對象作為remove()方法的參數,但是首先需要將i
處的對象分配給obj2
,這更加麻煩。 因此,將所有內容放在一起,新的固定循環將是
for (int i = 0; i < arr.size() - 1; i++){
if(str.equalsIgnoreCase(arr.get(i).getName())){
arr.remove(i);
}
}
假設只有一個雇員使用給定的名稱,這不會有問題,但是要警告在遍歷列表時刪除ArrayLists中的對象存在問題。 例如,如果刪除i
的對象,則ArrayList中位於其后的對象將全部向下移動一個索引。 然后,如果再次進行迭代,則將訪問列表中i+1
處的對象。 但是,位於i+1
的ACTUAL對象是最初位於i+2
的對象。 因此,如果您在ArrayList中刪除一個對象,則將跳過在下一迭代中直接檢查緊隨其后的對象的檢查。 一種簡單的解決方案是遍歷ArrayList的BACKWARDS,以便從列表中刪除一個對象時,已經檢查了所有向下移動一個索引的對象。 還有其他更合適的解決方案,但是向后迭代是解決該問題的一種簡單方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.