2013-05-06 17 views
12

Mam klasę o nazwie AuctionItem. Klasa AuctionItem ma metodę o nazwie getName(), która zwraca wartość String. Jeśli mam numer ArrayList typu AuctionItem, jaki jest najlepszy sposób na zwrócenie indeksu elementu o numerze ArrayList, który ma określoną nazwę?Uzyskiwanie indeksu elementu na liście tablic;

Wiem, że istnieje funkcja .indexOf(). Parametrem dla tej funkcji jest obiekt. Aby znaleźć element, który ma nazwę, powinienem użyć pętli for, a gdy element zostanie znaleziony, zwrócić pozycję elementu w ArrayList?

Czy istnieje lepszy sposób?

Odpowiedz

0

Aby znaleźć przedmiot, który ma nazwę, należy po prostu użyć pętli for, a gdy element zostanie znaleziony, zwraca pozycję elementu w ArrayList?

Tak do pętli (przy użyciu indeksów lub Iterator). Na zwracanej wartości albo zwróć jej indeks, albo sam przedmiot, w zależności od twoich potrzeb. ArrayList nie ma wartości indexOf (obiekt docelowy, Comparator porównaj) `lub podobny. Teraz, gdy Java otrzymuje wyrażenia lambda (w języku Java 8, marzec 2014 r.), Oczekuję, że interfejsy API otrzymają metody akceptujące obiekty lambda dla takich rzeczy.

9

Yes.you trzeba pętli to

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

Zasadniczo trzeba spojrzeć w górę ArrayList elementu na podstawie nazwy getName. Dwa podejścia do tego problemu:

1- Nie używaj ArrayList, Korzystanie HashMap<String,AutionItem> gdzie String byłoby nazwać

2- Korzystając getName generowania indeksu i używać indeksu opartego dodanie do listy tablicy list.add(int index, E element). Jednym ze sposobów, aby wygenerować indeks z nazwą byłoby użyć jego hashCode i modulo przez ArrayList obecnej wielkości (coś podobnego, co jest wykorzystywane wewnątrz HashMap)

+1

+1 za używanie HashMap – Kai

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

myślę, że powinno być na pętli poprawnym rozwiązaniem:

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

Możesz zaimplementować hashCode//equals swojego AuctionItem, aby dwa z nich były równe, jeśli mają taką samą nazwę. Gdy to zrobisz, możesz użyć metod indexOf i contains z następującej metody: ArrayList. Lub gdy przyjmiesz w metodzie równości, że łańcuch jest przekazywany: arrayList.indexOf("The name"). Ale to nie jest najlepszy projekt.

Ale wolałbym również użyć HashMap do zamapowania nazwy na przedmiot.

0

Zamiast pętli z brutalną siłą na liście (np. Od 1 do 10000) należy raczej zastosować metodę iteracyjnego wyszukiwania: Listę należy posortować według badanego elementu.

wyszukiwania Zacznij od wielkości środkowy element()/2 np 5000 jeśli pozycja wyszukiwania większa niż elementu w 5000, a następnie przetestować element w punkcie środkowym pomiędzy górną (10000) i środkowego (5000) - 7500

rób to dopóki nie dotrzesz do meczu (lub użyj pętli brutalnej siły, gdy osiągniesz mniejszy zasięg (np. 20 pozycji)

Możesz przeszukać listę 10000 w około 13 do 14 testów, zamiast potencjalnie 9999 testów

Powiązane problemy