Aș dori să obțin indexul unui obiect dintr-o listă prin proprietatea sa în Java.
Exemplu:
List<MyObj> list = new ArrayList<>();
list.add(new MyObj("Ram");
list.add(new MyObj("Girish");
list.add(new MyObj("Ajith");
list.add(new MyObj("Sai");
public class MyObj {
public String name;
public MyObj(String name){
this.name=name;
}
}
Acum, aș dori să obțin indexul unui obiect care conține numele „Girish”. Vă rog să-mi comunicați codul în JAVA.
- Posibil duplicat al căutării în Java ArrayList – > Por salvatore.
- Posibil duplicat al indexOf() nu va găsi un tip de obiect personalizat – > Por Ashok Kumar N.
- De ce aveți nevoie să obțineți indicele deloc? – > Por MC Emperor.
- Bună întrebare MC. De fapt, aș dori să actualizez obiectul respectiv atunci când vine o actualizare de la server. Aici serverul va da actualizări doar pentru obiecte individuale. Deci, trebuie să caut vechiul obiect din lista mea și trebuie să îl actualizez. La final, am nevoie de toate aceste obiecte într-o listă pentru a face niște analize – > Por Girish Setti.
Dacă doriți o soluție cu flux utilizați acest lucru:
int index = IntStream.range(0, list.size())
.filter(i -> list.get(i).name.equals(searchName))
.findFirst();
.orElse(-1);
În cazul în care aveți un List
, tot ce puteți face este să iterați peste fiecare element și să verificați proprietatea necesară. Aceasta este O(n).
public static int getIndexOf(List<MyObj> list, String name) {
int pos = 0;
for(MyObj myObj : list) {
if(name.equalsIgnoreCase(myObj.name))
return pos;
pos++;
}
return -1;
}
În cazul în care doriți să creșteți performanța. Atunci ați putea să vă implementați propria structură de date. Notă, că caracteristica cheie este că proprietatea cheie trebuie să fie o cheie a unei HashMap
și o valoare de HashMap
ar trebui să fie un indice. Atunci veți obține O(1) performanță.
public static final class IndexList<E> extends AbstractList<E> {
private final Map<Integer, E> indexObj = new HashMap<>();
private final Map<String, Integer> keyIndex = new HashMap<>();
private final Function<E, String> getKey;
public IndexList(Function<E, String> getKey) {
this.getKey = getKey;
}
public int getIndexByKey(String key) {
return keyIndex.get(key);
}
@Override
public int size() {
return keyIndex.size();
}
@Override
public boolean add(E e) {
String key = getKey.apply(e);
if (keyIndex.containsKey(key))
throw new IllegalArgumentException("Key '" + key + "' duplication");
int index = size();
keyIndex.put(key, index);
indexObj.put(index, e);
return true;
}
@Override
public E get(int index) {
return indexObj.get(index);
}
}
Demonstrație:
IndexList<MyObj> list = new IndexList<>(myObj -> myObj.name);
list.add(new MyObj("Ram"));
list.add(new MyObj("Girish"));
list.add(new MyObj("Ajith"));
list.add(new MyObj("Sai"));
System.out.println(list.getIndexByKey("Ajith")); // 2
- @ScaryWombat Îmi pare rău, e vina mea. Reparat – > .
- În comentariile OP a spus că vrea să returneze obiectul. ai putea schimba? – > .
Now, I would like to the get the index of an Object which contains the name as "Girish"
într-adevăr?! > .- @manfromnowhere Atunci când aveți indexul, obținerea obiectului este banală – > .
indexOf() va funcționa dacă schimbați funcția .equals
Aș sugera doar să iterăm prin
int getIndex(String wanted){
for(int i = 0; i<list.size(); i++){
if(list.get(i).name.equals(wanted)){
return i;
}
}
}
- Mulțumesc, Alexander. Dar există vreo modalitate fără această buclă? Pentru că în cazul meu ar putea exista posibilitatea de a avea peste 5k+ obiecte. – > .
- De asemenea, ați putea lua în considerare utilizarea unui
Map <String, MyObj>
– > . - Am încercat, dar la sfârșit, am nevoie de List<MyObj>. Cum pot obține Lista din Hartă? – > .
- @GirishSetti Ați încercat să faceți o cercetare de unul singur? Este trivial – > .
- Conform comentariului meu, harta va conține o cheie (fiind numele) și valoarea fiind valoarea
MyObj
– nu existăList
– > .
indexOf()
va returna indexul din prima apariție a unei valori. De exemplu:
int myIndex = list.indexOf("Ram")
(Rețineți totuși că lista de matrice nu conține „Ram”, ci un obiect de tip MyObj
cu un index name
de „Berbec”)
Rețineți că ArrayLists încep de la 0, nu de la unu.