Lepszy sposób na znalezienie indeksu elementu w ArrayList?

89

W przypadku aplikacji na Androida mam następujące funkcje

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

Czy to „najlepszy” sposób na napisanie funkcji do pobierania pozycji elementu? A może jest jakaś fantazyjna natywna funkcja shmancy w Javie, z której powinienem skorzystać?

Jacksonkr
źródło
2
Ten kod jest prawdopodobnie wadliwy: użycie ==spowoduje w większości przypadków nieprawidłowe wyniki.
3
Pamiętaj, że nie możesz porównywać ciągów z '==', musisz użyć String.equals (String str)
MrZander
5
@MrZander Jasne, że możesz je porównać z ==... to po prostu nie jest właściwe porównanie ;-)
Możesz powiedzieć, że wciąż jestem nowy w Javie… String.equalsbardziej przypomina to, co ===może być w języku takim jak JavaScript? na przykład. sprawdza pod kątem wartości ORAZ typu?
Jacksonkr,
3
Nie == jest tożsamością obiektu i oznacza „jest tym samym przedmiotem” . (Ten pogląd jest prawdziwy zarówno dla wartości pierwotnych, jak i typów referencyjnych, jeśli weźmiesz pod uwagę tylko jedną liczbę o wartości 42 lub znak „x” itp.). Object.equalsjest metodą wirtualną zdefiniowaną dla wszystkich instancji obiektów i oznacza "ma tę samą wartość" , ponieważ wszystkie typy klas rozszerzają Object i powinno być używane do wszystkich testów równości obiektów . Jest wiele pytań na temat cover ==vs Object.equalsi jest to bardzo ważna koncepcja do zrozumienia! Na przykład jest to fałsz "hello" == new String("hello"):! No!

Odpowiedzi:

192

ArrayListma indexOf()metodę . Sprawdź API, aby uzyskać więcej informacji, ale oto jak to działa:

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() zwróci szybko dokładnie to, co zwraca Twoja metoda.

Jon Egeland
źródło
3
Nie jest „szybszy” pod względem złożoności niż wysłany kod, chociaż można go wdrożyć wydajniej. Ponadto indexOf zareaguje tutaj nieco inaczej: oryginalny kod [nieprawidłowo] jest używany, ==podczas gdy indexOf używa equals().
W rzeczywistości jest to dokładnie ten sam kod (przynajmniej w kodzie Sun Java 6, który mam), z wyjątkiem tego, że rozpoczynają go od gałęzi if-else, która oddzielnie obsługuje wartość null.
yshavit
To okablowane stare tablice i List <> mają metodę FindIndex (), ale API zmienia się w środku dla ArrayList: D
boctulus
16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

Wyjście: Lista Indeks: 7

Jeśli przekażesz H , zwróci 7 , jeśli zdasz J , zwróci -1, tak jak zdefiniowaliśmy domyślną wartość -1.

Gotowe

Hiren Patel
źródło
Jak mogę zrobić to na odwrót, dla twojego rozwiązania twoje dane wejściowe to H i otrzymujesz pozycję H , Załóżmy, że jeśli moje dane wejściowe to indeks 7, jak mogę uzyskać wartość ciągu tego indeksu. Dziękuję
Jimale Abdi
1
@JimaleAbdi Do yourArrayList.get (7). 7 to twoja pozycja.
Hiren Patel
6

Jeśli Twój Listjest posortowany i ma dobry losowy dostęp (tak ArrayListjak), powinieneś sprawdzić Collections.binarySearch. W przeciwnym razie powinieneś użyć List.indexOf, jak wskazali inni.

Ale twój algorytm jest zdrowy, fwiw (inny niż ==inni wskazali).

yshavit
źródło
3

W Javie rzeczywiście istnieje wymyślna funkcja shmancy, którą powinieneś wykorzystać.

ArrayList ma metodę instancji o nazwie

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

Możesz to wywołać w _categoriesnastępujący sposób:

_categories.indexOf("camels")

Nie mam doświadczenia w programowaniu na Androida - ale to zadziałałoby w przypadku standardowej aplikacji Java.

Powodzenia.

rustybeanstalk
źródło
1
funkcja natywna implikuje dla mnie C \ C ++… Tylko mówię.
Hunter McMillen
3

Java API określa dwie metody, których możesz użyć: indexOf(Object obj)i lastIndexOf(Object obj). Pierwsza z nich zwraca indeks elementu, jeśli został znaleziony, -1 w przeciwnym razie. Drugi zwraca ostatni indeks, co byłoby jak przeszukiwanie listy wstecz.

danca
źródło
1

Najlepszym sposobem na znalezienie pozycji na liście jest użycie interfejsu Kolekcje,

Na przykład,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

Wyjście: 2

Pradeesh MP
źródło
1

Użyj metody indexOf (), aby znaleźć pierwsze wystąpienie elementu w kolekcji.

Vasu Dev Garg
źródło
0

najlepsze rozwiązanie tutaj

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map { x->x.Id }.indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)
Fatih Çakıroğlu
źródło