2013-05-06 58 views
12

我有一個類叫做AuctionItemAuctionItem類有一個名爲getName()的方法,返回String。如果我有ArrayList類型AuctionItem,返回ArrayList中具有特定名稱的項目索引的最佳方法是什麼?我知道.indexOf()函數。這個函數的參數是一個對象。要找到具有名稱的項目,我應該只使用for循環,並且找到該項目後,返回ArrayList中的元素位置?獲取數組列表中項目的索引;

有沒有更好的方法?

回答

0

要找到具有名稱的項目,我應該只使用for循環,並且找到該項目時,返回ArrayList中的元素位置?

是的循環(使用索引或Iterator)。在返回值上,根據需要返回其索引或項目iteself。 ArrayList沒有indexOf(對象目標,Comparator比較)`或類似的。現在Java已經獲得了lambda表達式(在Java 8中,〜2014年3月),我希望我們會看到APIs接受lambda表達式的方法。

9

Yes.you必須循環它

public int getIndex(String itemName) 
{ 
    for (int i = 0; i < arraylist.size(); i++) 
    { 
     AuctionItem auction = arraylist.get(i); 
     if (itemName.equals(auction.getname())) 
     { 
      return i; 
     } 
    } 

    return -1; 
} 
5

基本上你需要基於名稱getName查找ArrayList元素。有兩種方法解決這個問題:

1,不要使用ArrayList,使用HashMap<String,AutionItem>其中String將被命名

2 - 使用getName生成指數和指數使用基於在添加到數組列表list.add(int index, E element)。以從名稱索引的一種方法是通過ArrayList電流大小(裏面是什麼HashMap使用類似的東西)來使用它的hashCode和模

+1

+1使用HashMap – Kai 2013-05-06 07:24:47

1
for (int i = 0; i < list.length; i++) { 
    if (list.get(i) .getName().equalsIgnoreCase("myName")) { 
    System.out.println(i); 
    break; 
    } 
} 
14

我覺得一個for循環應該是一個有效的解決方案:

public int getIndexByname(String pName) 
    { 
     for(AuctionItem _item : *yourArray*) 
     { 
      if(_item.getName().equals(pName)) 
       return *yourarray*.indexOf(_item) 
     } 
     return -1; 
    } 
0

你可以實現你的AuctionItemhashCode/equals,這樣如果它們中的兩個名稱相同,它們是相等的。當你這樣做時,你可以使用ArrayListindexOfcontains這樣的方法:arrayList.indexOf(new AuctionItem("The name"))。或者當您在equals方法中假定傳遞一個字符串時:arrayList.indexOf("The name")。但這不是最好的設計。

但我還希望使用HashMap將名稱映射到該項目。

0

而不是通過列表的強力循環(例如1到10000),而是使用迭代搜索方法: 列表需要按要測試的元素排序。

在中間元件尺寸()開始搜索/ 2例如5000 如果檢索項比元件更大的在5000,則在(10000)(5000)的上部之間的中點和中點測試元件 - 7500

繼續這樣做,直到你達到匹配(或通過一旦你到一個更小的範圍使用蠻力循環(例如20項)

您可以搜索約13到14測試10000的列表,而不是潛在的9999測試