1057 votes

Comment joindre deux listes en Java?

Conditions: ne modifiez pas les listes originales; JDK uniquement, pas de bibliothèques externes. Points bonus pour un one-liner ou une version JDK 1.3.

Y a-t-il un moyen plus simple que:

 List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
 

1047voto

Dale Emery Points 208

En Java 8:

 List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).collect(Collectors.<String>toList());
 

690voto

AdamC Points 5828

Au sommet de ma tête, je peux le raccourcir d'une ligne:

 List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);
 

441voto

Guillermo Points 603

hmmm il existe ListUtils.union(list1,list2); fonctionne cool!

101voto

Kevin K Points 4279

L'un de vos exigences, est de préserver les listes initiales. Si vous créez une nouvelle liste et utiliser addAll(), vous permettant ainsi de doubler le nombre de références aux objets dans vos listes. Cela pourrait conduire à des problèmes de mémoire si votre liste est très grande.

Si vous n'avez pas besoin de modifier le résultat concaténé, vous pouvez éviter cela en utilisant une liste personnalisée de mise en œuvre. La coutume de la mise en œuvre de la classe est plus d'une ligne, bien évidemment...mais il est court et doux.

CompositeUnmodifiableList.java:

public class CompositeUnmodifiableList<E> extends AbstractList<E> {

    private final List<E> list1;
    private final List<E> list2;

    public CompositeUnmodifiableList(List<E> list1, List<E> list2) {
        this.list1 = list1;
        this.list2 = list2;
    }

    @Override
    public E get(int index) {
        if (index < list1.size()) {
            return list1.get(index);
        }
        return list2.get(index-list1.size());
    }

    @Override
    public int size() {
        return list1.size() + list2.size();
    }
}

Utilisation:

List<String> newList = new CompositeUnmodifiableList<String>(listOne,listTwo);

97voto

volley Points 3229

Probablement pas plus simple, mais intrigant et moche:

 List<String> newList = new ArrayList<String>() { { addAll(listOne); addAll(listTwo); } };
 

Ne l'utilisez pas dans le code de production ...;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X