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ć?
==
spowoduje w większości przypadków nieprawidłowe wyniki.==
... to po prostu nie jest właściwe porównanie ;-)String.equals
bardziej przypomina to, co===
może być w języku takim jak JavaScript? na przykład. sprawdza pod kątem wartości ORAZ typu?==
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.equals
jest 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==
vsObject.equals
i jest to bardzo ważna koncepcja do zrozumienia! Na przykład jest to fałsz"hello" == new String("hello")
:! No!Odpowiedzi:
ArrayList
maindexOf()
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.źródło
==
podczas gdy indexOf używaequals()
.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
źródło
Jeśli Twój
List
jest posortowany i ma dobry losowy dostęp (takArrayList
jak), 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).źródło
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
_categories
nastę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.
źródło
Java API określa dwie metody, których możesz użyć:
indexOf(Object obj)
ilastIndexOf(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.źródło
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
źródło
Użyj metody indexOf (), aby znaleźć pierwsze wystąpienie elementu w kolekcji.
źródło
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)
źródło