J'ai un List<A>
qui contient des objets A
avec l'ID d'attribut. Ce dont j'ai besoin, c'est que la liste ne contienne qu'un seul objet pour un identifiant.
public List<A> findAllA() {
List<A> aList; // fetches the elements from db
HashMap<Long, A> aMap = new HashMap<>();
for (A a: aList) {
aMap.put(a.getId(), a);
}
return new ArrayList<>(aMap.values());
}
J'ai donc mis mes éléments de liste dans un HashMap
, car un HashMap
contient des clés distinctes. Ensuite, un nouveau ArrayList<A>
avec les valeurs de la carte est renvoyé. Cela fonctionne bien, mais y a-t-il un moyen plus efficace d'atteindre le résultat? Ou au moins un plus court?
4 réponses
Si vous recherchez moins de caractères / lignes de codes, vous pouvez utiliser les Stream
s:
return aList.stream().distinct().collect(Collectors.toList());
Cela suppose que vos A
remplacements de classe equals
et deux instances de A
sont égales si et seulement si elles ont le même ID.
Bien sûr, si tel est le cas, vous pouvez également utiliser un HashSet
pour éliminer les doublons:
return new ArrayList<A>(new HashSet<A>(alist));
Si votre classe A
ne remplace pas equals
(ou equals
ne se comporte pas comme mentionné ci-dessus), utiliser un HashMap
comme vous l'avez fait est une solution de temps linéaire efficace. Vous ne pouvez pas faire mieux en termes de temps de fonctionnement moyen.
En suivant simplement votre logique, vous pouvez essayer comme ça aussi
public List<A> findAllA() {
List<A> aList; // fetches the elements from db
HashMap<Long, A> aMap = new HashMap<>();
List<Long> processedList = new ArrayList<>();
for (A a: aList) {
if(!processedList.contains(a.getId())) {
processedList.add(a.getId());
aMap.put(a.getId(), a);
}
}
return new ArrayList<>(aMap.values());
}
Si les méthodes equals()/hashCode()
reposent sur le id
, vous pouvez simplement créer un Set
à partir du List
:
Set<A> set = new HashSet<>(aList);
Set
supprime les éléments en double égaux en termes de equals()
.
Si le type Set
ne convient pas, vous pouvez toujours le transformer en List
:
List<A> newList = new ArrayList<A>(new HashSet<A>(alist));
Utilisation du flux Java 8:
List<A> aList; // fetches the elements from db
Collection<A> original= aList.stream()
.<Map<Integer, A>> collect(HashMap::new,(m,e)->m.put(e.getId(), e), Map::putAll).values();
Questions connexes
De nouvelles questions
java
Java est un langage de programmation de haut niveau. Utilisez cette balise lorsque vous rencontrez des problèmes pour utiliser ou comprendre la langue elle-même. Cette balise est rarement utilisée seule et est le plus souvent utilisée en conjonction avec [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] et [maven].