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?

3
melanzane 16 nov. 2017 à 16:15

4 réponses

Meilleure réponse

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.

2
Eran 16 nov. 2017 à 13:20

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());
    }
0
Bikramjit Rajbongshi 16 nov. 2017 à 13:27

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));
0
davidxxx 16 nov. 2017 à 13:20

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();
0
Indent 16 nov. 2017 à 13:20
47330654