3
votes

Comment obtenir l'index de l'objet par sa propriété dans la liste Java

Je voudrais obtenir l'index d'un objet dans une liste par sa propriété en Java.
Exemple:

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

Maintenant, je voudrais obtenir l'index d'un objet qui contient le nom "Girish". Veuillez me faire savoir le code en JAVA.


4 Réponses :


-4
votes

indexOf () retournera l'index de la première occurrence d'une valeur. Par exemple:

int myIndex = list.indexOf ("Ram")

(Notez cependant que votre arraylist ne contient pas "Ram", il contient un objet de type MyObj avec un nom de "Ram")

Gardez à l'esprit que les ArrayLists commencent à 0 et non à un.


0 commentaires

1
votes

indexOf () fonctionnera si vous changez la fonction .equals

Je suggérerais simplement de parcourir

int getIndex(String wanted){
  for(int i = 0; i<list.size(); i++){
    if(list.get(i).name.equals(wanted)){
      return i;
    }
  }
}


7 commentaires

Merci Alexandre. Mais y a-t-il un moyen sans cette boucle? Parce que dans mon cas, il peut y avoir une chance d'avoir 5k + objets.


Vous pouvez également envisager d'utiliser une Map


J'ai essayé mais à la fin, j'ai besoin de la liste . Comment obtenir la liste à partir de la carte?


@GirishSetti Avez-vous essayé de faire des recherches par vous-même? C'est trivial


@ScaryWombat J'ai essayé mais la carte donne le seul util.Collections mais pas util.list.


Selon mon commentaire, la carte contiendra une clé (étant le nom) et la valeur correspondant au MyObj - il n'y a pas de List


@GirishSetti Si vous avez absolument besoin d'une liste, vous pouvez faire: List list = new ArrayList <> (map.values ​​()); . Si vous devez conserver les objets dans le même ordre dans lequel ils ont été ajoutés à la carte, vous pouvez utiliser un LinkedHashMap .



3
votes

Si vous avez une Liste , tout ce que vous pouvez faire est de parcourir chaque élément et de vérifier la propriété requise. C'est O(n)

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

Au cas où vous voudriez augmenter les performances. Ensuite, vous pouvez implémenter votre propre structure de données. Notez que cette caractéristique clé est que votre propriété de clé doit être une clé d'un HashMap et que la valeur de HashMap doit être index. Ensuite, vous obtenez les performances de O (1) .

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

Démo:

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


4 commentaires

@ScaryWombat Désolé, ma faute. Fixé


Dans les commentaires, OP dit veut retourner un objet. pourriez-vous changer?


Maintenant, je voudrais obtenir l'index d'un objet qui contient le nom comme "Girish" vraiment ?!


@manfromnowhere Lorsque vous avez l'index, obtenir l'objet est trivial



5
votes

Si vous voulez une solution avec stream, utilisez celle-ci:

int index = IntStream.range(0, list.size())
     .filter(i -> list.get(i).name.equals(searchName))
     .findFirst();
     .orElse(-1);


0 commentaires