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 :
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.
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; } } }
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
@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
. 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
.
Si vous avez une 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 Démo: 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
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);
}
}
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;
}
@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
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);
Double possible de la recherche dans java ArrayList
Une duplication possible de indexOf () ne trouvera pas de type d'objet personnalisé a >
Pourquoi avez-vous besoin d'obtenir l'index?
Bonne question MC. En fait, je voudrais mettre à jour cet objet particulier lorsqu'une mise à jour est venue du serveur. Ici, le serveur donnera des mises à jour pour les objets individuels uniquement. Je dois donc rechercher l'ancien objet dans ma liste et je dois mettre à jour. À la fin, j'ai besoin de tous ces objets dans une liste pour faire des analyses