Cum se obține indexul obiectului prin proprietatea sa în lista Java (Programare, Java, Arraylist)

Girish Setti a intrebat.

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.

Comentarii

  • 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.
4 răspunsuri
michal.jakubeczy

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);

oleg.cherednik

Î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

Comentarii

  • @ScaryWombat Îmi pare rău, e vina mea. Reparat –  > Por oleg.cherednik.
  • În comentariile OP a spus că vrea să returneze obiectul. ai putea schimba? –  > Por soorapadman.
  • Now, I would like to the get the index of an Object which contains the name as "Girish" într-adevăr?!  > Por oleg.cherednik.
  • @manfromnowhere Atunci când aveți indexul, obținerea obiectului este banală –  > Por Scary Wombat.
Alexander Mittermüller

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;
    }
  }
}

Comentarii

  • 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. –  > Por Girish Setti.
  • De asemenea, ați putea lua în considerare utilizarea unui Map <String, MyObj> –  > Por Scary Wombat.
  • Am încercat, dar la sfârșit, am nevoie de List<MyObj>. Cum pot obține Lista din Hartă? –  > Por Girish Setti.
  • @GirishSetti Ați încercat să faceți o cercetare de unul singur? Este trivial –  > Por Scary Wombat.
  • Conform comentariului meu, harta va conține o cheie (fiind numele) și valoarea fiind valoarea MyObj – nu există List –  > Por Scary Wombat.
MrB

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.