Java'da iki listeye nasıl katılabilirim?


749

Koşullar: orijinal listeleri değiştirmeyin; Yalnızca JDK, harici kitaplık yok. Tek astarlı veya JDK 1.3 sürümü için bonus puanlar.

Şundan daha basit bir yol var mı:

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

5
Bunu yalnızca yineleme amacıyla yapıyorsanız başka bir soruya bakın - google guava ve java 8 çözümleri var stackoverflow.com/questions/4896662/…
Boris Treukhov

Yardımcı yöntemle Java 8 çözümü: stackoverflow.com/a/37386846/1216775
akhil_mittal

Bazı cevapları okuduktan sonra sordum üzgünüm.
Anthony Rutledge

Yanıtlar:


591

Java 8'de:

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

82
Gawd, Java 8'de bir şey mi var? Teknik olarak kazanmak sanırım, ama bu uzun bir çizgi halkı :-)
Robert Atkins

4
Sıradan okuyucu için, burada Java _ Streams kullanan daha kısa bir çözüm var: stackoverflow.com/a/34090554/363573
Stephan

7
Çirkin ama en azından akıcı ve çok satırlı lambdalar olmadan kullanılabilir. Gerçekten akıcı bir eklenti olmasını isterdim
Usman Ismail

6
Sanırım bundan da ayrı bir liste almanın gerçekten kolay olduğunu belirtmek gerekir:List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).distinct().collect(Collectors.toList());
Roger

1
Concat alternatifi: akarsu akışıStream.of(listOne, listTwo).flatMap(Collection::stream).collect(Collectors.toList())
Peter Walser

569

Başımın üstünden, bir satır kısaltabilirim:

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

156
Teknik olarak doğru olsanız da, bunu bir satır kısalttınız, bunun asimetrisi beni rahatsız ediyor. Yeter ki ekstra çizgiyi "harcamak" için daha mutluyum.
Robert Atkins

13
Burada newList öğesinin interal dizisinin listOne boyutuna başlatılacağı ve listTwo öğesindeki tüm öğeleri eklerken potansiyel olarak genişlemesi gereken bir sorun yok mu? Her listenin boyutunu alıp yeni diziyi boyutlandırmak için kullanmak daha iyi olur mu?
Eric

2
Benim için en uygun çözüm buydu. Kazanan ortaya çıkan farklı çözümlerin performansı, boş liste ve addAll()her ikisinin de oluşturulmasıyla bir karşılaştırma yaptım . Listelerin kopyalanmamasını önerenlerin hepsini denedim ve bu sefer ihtiyaç duymadığımız çok fazla yüke sahip oldular.
manuelvigarcia

güzel ama daha da kısaltabilirsiniz: List list = new ArrayList <> (list1) .addAll (list2);
hız

1
@velocity: hayır, bu işe yaramayacak. addAll(Collection)döndürür a boolean.
Stijn Van Bael

306

Sen kullanabilirsiniz Apache commons-koleksiyonları kütüphane:

List<String> newList = ListUtils.union(list1, list2);

52
Güzel, ama apache müşterekler gerektirir. 'Harici kütüphane yok' dedi
Quantum7

101
@ Quantum7, diğer insanlar için hala yararlı;) Ayrıca, apache müşterileri harici bir kütüphane bile mi? Onsuz hiçbir şeye başlamam!
12'de

28
@Platinum ListUtils.union belgelerine göre OP koduna tam olarak eşdeğerdir. Ancak belki de liste bağlamında bir SET işlemi ("Birlik") kullanmak yanıltıcıdır. Bunun kopyaları veya başka bir şeyi kaldırmasını nasıl beklediğinizi görebilirim, ancak yöntem bunu yapmıyor gibi görünüyor.
Quantum7

24
Apache Commons Koleksiyonlarından kaçının. Tipik değil, jenerik yok. Java 1.4 kullanıyorsanız harika, ancak Java 5 ve üstü için Google Guava'yı tercih ederim.
Michael Piefel

11
@MichaelPiefel En son Apache Commons Koleksiyonlar 4 tip güvenlidir. Java 8 yöntem referansı ile, bu tür statik yardımcı programlar çok önemli hale gelir.
mingfai

93

Gereksinimlerinizden biri orijinal listeleri korumaktır. Yeni bir liste oluşturup kullanırsanız addAll(), listelerinizdeki nesnelere yapılan başvuru sayısını etkili bir şekilde iki katına çıkarırsınız . Listeleriniz çok büyükse bu, bellek sorunlarına yol açabilir.

Birleştirilmiş sonucu değiştirmeniz gerekmiyorsa, özel bir liste uygulaması kullanarak bundan kaçınabilirsiniz. Özel uygulama sınıfı, birden fazla satırdan oluşuyor, tabii ki ... ama onu kullanmak kısa ve tatlı.

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

Kullanımı:

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

15
Bu sorunun gerçek cevabı bu.
Wouter Lievens

9
Bu uygulanabilir bir çözümdür, ancak temel alınan liste nesneleri (list1, list2) değişirse, bu listenin içeriğinin değiştiğini unutmayın. Sen CompositeUnmodifiableList bir örneğini değiştirmek mümkün olmayabilir kendisi ancak orijinal listelerine bir başvuru alabilirsiniz, o zaman yapabilirsiniz. Ayrıca tanıdık olmayanlar için: son değiştirici yalnızca liste nesnesine yapılan başvuruyu etkiler, değişemez ancak listenin içeriğinin değişmesi yine de mümkündür!
jwj

3
@jwj çok iyi puanlar, teşekkür ederim. Sınıf adı muhtemelen bazı açıklamaları hak etmektedir. Bu sınıfı Collections.unmodifiableList()değiştirilemez hale getirmek için bir liste sarar yöntemine çok benzer bir şey yapıyor olarak görüyorum . CompositeUnmodifiableListaynı şeyi yapar, ancak iki listeyi sarar ve sıralı bir görünüm sağlar. Bahsettiğiniz tüm noktalar CompositeUnmodifiableListda doğrudur Collections.unmodifiableList().
Kevin K

2
Yapıcı alabilirList<? extends E>
Patrick Parker

84

Muhtemelen daha basit değil, ilgi çekici ve çirkin:

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

Üretim kodunda kullanmayın ...;)


44
Çirkin ve kötü, tıpkı çift parantez başlatmanın neredeyse her kullanımı gibi. Yine de daha kısa;)
Jorn

4
@MarnixKlooster: Eclipse kullanmamanız gerektiğini biliyor ve kullanımı hoş değil ;-)
Joachim Sauer

20
Fiziksel olarak bir satır olmasına rağmen, bunu bir "tek astar" olarak görmüyorum.
splungebob

11
neden insanlar anonim blok başlatıcılardan nefret ediyor
NimChimpsky

18
@NimChimpsky Bence çoğunlukla sadece anonim bir blok başlatıcısı değil, aslında ArrayList'in anonim bir alt sınıfını oluşturuyorsunuz. Bununla birlikte, eğer bu Çift Brace Başlatma sorununun sonuçlarına güveniyorsanız, DBI'dan nefret etmek çoğunlukla stilistik bir tat ve mikro optimizasyon meselesi gibi görünüyor. Anlayabildiğim kadarıyla bunu yapmak için büyük bir ceza yok. Sinsi dezavantajı, ArrayList olmayacağı için sınıfını karşılaştırmayı denediyseniz olurdu.
Patrick

75

Başka bir Java 8 tek katlı:

List<String> newList = Stream.of(listOne, listTwo)
                            .flatMap(Collection::stream)
                            .collect(Collectors.toList());

Bonus olarak, Stream.of()değişken olduğu için, istediğiniz sayıda listeyi birleştirebilirsiniz.

List<String> newList = Stream.of(listOne, listTwo, listThree)
                            .flatMap(Collection::stream)
                            .collect(Collectors.toList());

35
x -> x.stream()ile değiştirilebilir Collection::stream.
Martin

10
... hatta ile List::stream.
MC İmparatoru

73

Daha basit değil, ek yükü yeniden boyutlandırmadan:

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

55

Bu soruyu, harici kütüphanelere bakılmaksızın, rastgele sayıda listeyi birleştirmek isteyen buldum. Yani, belki başka birine yardımcı olacaktır:

com.google.common.collect.Iterables#concat()

() İçin aynı mantığı bir arada bulunan farklı koleksiyonlara uygulamak istiyorsanız kullanışlıdır.


9
Örneğin: Lists.newArrayList (Iterables.concat (liste1, liste2));
meilechh

com.google.common.collect.Iterators#concat(java.util.Iterator<? extends java.util.Iterator<? extends T>>)yerine aramalısınız Iterables#concat(); çünkü daha sonra öğeleri geçici bağlantıya kopyalar!
bob

45

Java 8 ( Stream.ofve Stream.concat)

Önerilen çözüm üç liste içindir, ancak iki liste için de uygulanabilir. Java 8'de Stream.of veya Stream.concat'i şu şekilde kullanabiliriz :

List<String> result1 = Stream.concat(Stream.concat(list1.stream(),list2.stream()),list3.stream()).collect(Collectors.toList());
List<String> result2 = Stream.of(list1,list2,list3).flatMap(Collection::stream).collect(Collectors.toList());

Stream.concatiki akışı girdi olarak alır ve öğeleri birinci akışın tüm elemanları, ardından ikinci akışın tüm elemanları olan tembel olarak birleştirilmiş bir akış oluşturur. Üç listemiz olduğu için bu yöntemi ( Stream.concat) iki kez kullandık.

Ayrıca, herhangi bir sayıda listeyi ( varargs kullanarak ) alan ve birleştirilmiş listeyi şu şekilde döndüren bir yöntemle bir yardımcı program sınıfı yazabiliriz :

public static <T> List<T> concatenateLists(List<T>... collections) {
        return Arrays.stream(collections).flatMap(Collection::stream).collect(Collectors.toList()); 
}

O zaman bu yöntemi kullanabiliriz:

List<String> result3 = Utils.concatenateLists(list1,list2,list3);

Muhtemelen List <String> sonuç1 = Stream.concat (Stream.concat (list1.stream (), list2.stream ()), list3.stream ()). Collect (Collectors.toList ()); ilk operatörünüzde. Lütfen düzeltin.
WebComer

44

İşte iki satır kullanan bir java 8 çözümü:

List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);

Bu yöntemin aşağıdaki durumlarda kullanılmaması gerektiğini unutmayın.

  • kaynağı newListbilinmemektedir ve zaten diğer konularla paylaşılmış olabilir
  • değiştirilen newListakış paralel bir akıştır ve erişim newListsenkronize veya iş parçacığı için güvenli değildir

yan etki nedeniyle.

Yukarıdaki koşulların her ikisi de yukarıdaki iki listeye katılma durumu için geçerli değildir, bu nedenle güvenlidir.

Başka bir soruya verilen bu cevaba dayanarak .


12
Eğer yanılmıyorsam bu aslında önerilmez - docs.oracle.com/javase/8/docs/api/java/util/stream/… Lütfen yan etkiler bölümüne bakın. > Akış işlemlerine yönelik davranışsal parametrelerdeki yan etkiler, genellikle vatansızlık gereksiniminin yanı sıra diğer iş parçacığı güvenliği tehlikelerinin farkında olmadan ihlal edilmesine yol açabileceğinden, genellikle önerilmez. Bu durumda, Collectors.toList ()
Anton Balaniuc

@AntonBalaniuc Soru, bunun gerçekten bir yan etkisi olup olmadığıdır. Bu noktada newListbaşka bir iş parçacığı tarafından gözlemlenemez. Ancak, değerin nereden geldiği bilinmiyorsa newList(örneğin newListbir parametre olarak iletildiyse) muhtemelen yapılmaması gerektiği konusunda
haklısınız

2
Merak ediyorum; neden .forEach(newList::addAll);yerine .collect(Collectors.toList());?
11684

4
@ 11684 çünkü toplayıcı bir List<List<Object>>. Aklınızdaki gibi bir şey: stackoverflow.com/questions/189559/…
SpaceTrucker

@SpaceTrucker Hata, bunu göz ardı ettim. Kafamı temizlediğin için teşekkürler. Evet, düşünmeliydim flatMap.
11684

34

Bu basit ve sadece bir satır, ancak listTwo içeriğini listOne öğesine ekleyecektir. İçeriği gerçekten üçüncü bir listeye koymanız gerekiyor mu?

Collections.addAll(listOne, listTwo.toArray());

11
Orijinal listelerde değişiklik yapılmaması, ölçütlerden biriydi, ancak bu, bir kısıtlama olmadığı durumlar için burada örnek olarak yararlıdır.
Robert Atkins

1
Teşekkürler, hatta daha basit bir listeOne.addAll (listTwo)
Jay

27

Biraz daha basit:

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

Bu yinelenen Dizeler neden olur? Her iki listede var olan bir Dize sonuç listesinde iki kez var anlamına gelir?
AgentKnopf

4
@Zainodis Evet, kopyalar olabilir. ListYapı hiçbir özgünlüğü kısıtlar getirmektedir. Kümeleri setlerle aynı şeyi yaparak düzeltebilirsiniz. Set<String> newSet = new HashSet<>(setOne); newSet.addAll(setTwo);
Patrick

20

Biraz daha kısa olurdu:

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

17

İstediğiniz sayıda listeyi birleştirmek için genel Java 8 yardımcı programı yönteminizi oluşturabilirsiniz .

@SafeVarargs
public static <T> List<T> concat(List<T>... lists) {
    return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList());
}

13

Hedef listesi önceden tahmin edilirse bir oneliner yapabilirsiniz.

(newList = new ArrayList<String>(list1)).addAll(list2);


9

Java8akım flatMapzaten kullanan başka bir tek çözüm , çözüm zaten gönderildiğinden, işte olmayan bir çözümflatMap

List<E> li = lol.stream().collect(ArrayList::new, List::addAll, List::addAll);

veya

List<E> ints = Stream.of(list1, list2).collect(ArrayList::new, List::addAll, List::addAll);

kod

    List<List<Integer>> lol = Arrays.asList(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6));
    List<Integer> li = lol.stream().collect(ArrayList::new, List::addAll, List::addAll);
    System.out.println(lol);
    System.out.println(li);

çıktı

[[1, 2, 3], [4, 5, 6]]
[1, 2, 3, 4, 5, 6]

1
Bu çözümün muhtemelen kullanandan daha performanslı olduğunu ekleyebilirim flatMap, çünkü listeler toplandıklarında yalnızca bir kez yinelenir
Stefan Haberl

7

Bence en akıllısı:

/**
 * @param smallLists
 * @return one big list containing all elements of the small ones, in the same order.
 */
public static <E> List<E> concatenate (final List<E> ... smallLists)
{
    final ArrayList<E> bigList = new ArrayList<E>();
    for (final List<E> list: smallLists)
    {
        bigList.addAll(list);
    }
    return bigList;
}

3
Unutma @SafeVarargs!
Radon Rosborough

6

Statik bir içe aktarma ve bir yardımcı sınıfla yapabilirsiniz

nb bu sınıfın türetilmesi muhtemelen geliştirilebilir

public class Lists {

   private Lists() { } // can't be instantiated

   public static List<T> join(List<T>... lists) {
      List<T> result = new ArrayList<T>();
      for(List<T> list : lists) {
         result.addAll(list);
      }
      return results;
   }

}

Sonra gibi şeyler yapabilirsiniz

import static Lists.join;
List<T> result = join(list1, list2, list3, list4);

Statik içe aktarma veya yardımcı sınıf nasıl ilişkilidir?
shmosel

6

Nesne anahtarıyla katılma desteğine sahip Java 8 sürümü:

public List<SomeClass> mergeLists(final List<SomeClass> left, final List<SomeClass> right, String primaryKey) {
    final Map<Object, SomeClass> mergedList = new LinkedHashMap<>();

    Stream.concat(left.stream(), right.stream())
        .map(someObject -> new Pair<Object, SomeClass>(someObject.getSomeKey(), someObject))
        .forEach(pair-> mergedList.put(pair.getKey(), pair.getValue()));

    return new ArrayList<>(mergedList.values());
}

4
public static <T> List<T> merge(List<T>... args) {
    final List<T> result = new ArrayList<>();

    for (List<T> list : args) {
        result.addAll(list);
    }

    return result;
}

4

Bir Helper sınıfı kullanın.

Öneririm:

public static <E> Collection<E> addAll(Collection<E> dest, Collection<? extends E>... src) {
    for(Collection<? extends E> c : src) {
        dest.addAll(c);
    }

    return dest;
}

public static void main(String[] args) {
    System.out.println(addAll(new ArrayList<Object>(), Arrays.asList(1,2,3), Arrays.asList("a", "b", "c")));

    // does not compile
    // System.out.println(addAll(new ArrayList<Integer>(), Arrays.asList(1,2,3), Arrays.asList("a", "b", "c")));

    System.out.println(addAll(new ArrayList<Integer>(), Arrays.asList(1,2,3), Arrays.asList(4, 5, 6)));
}

3
public static <T> List<T> merge(@Nonnull final List<T>... list) {
    // calculate length first
    int mergedLength = 0;
    for (List<T> ts : list) {
      mergedLength += ts.size();
    }

    final List<T> mergedList = new ArrayList<>(mergedLength);

    for (List<T> ts : list) {
      mergedList.addAll(ts);
    }

    return mergedList;
  }

2

2 yaklaşımla java8 kullanarak 2 listeye katılabiliriz.

    List<String> list1 = Arrays.asList("S", "T");
    List<String> list2 = Arrays.asList("U", "V");

1) Concat kullanımı:

    List<String> collect2 = Stream.concat(list1.stream(), list2.stream()).collect(toList());
    System.out.println("collect2 = " + collect2); // collect2 = [S, T, U, V]

2) flatMap kullanma:

    List<String> collect3 = Stream.of(list1, list2).flatMap(Collection::stream).collect(toList());
    System.out.println("collect3 = " + collect3); // collect3 = [S, T, U, V]

1
On bir yaşındaki bir soruyu otuz diğer cevapla yanıtlarken, cevabınızın hangi yeni yönlerini ele aldığından emin olun ve bu tekniklerin soru sorulduğunda işe yarayıp yaramayacağını ya da sorulan özelliklere bağlı olup olmadığını not edin. yıllar içinde tanıtıldı.
Jason Aller

2

Cevapların neredeyse tamamı bir ArrayList kullanmanızı önerir.

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

Verimli ekleme işlemleri için LinkedList kullanmayı tercih edin.

ArrayList eklentisi O (1) amortismana tabi tutulur, ancak dizinin yeniden boyutlandırılması ve kopyalanması gerektiğinden O (n) en kötü durumdur. LinkedList ekleme her zaman sabit O (1) iken.

daha fazla bilgi https://stackoverflow.com/a/322742/311420


0

Basit olduğunu iddia etmiyorum, ama tek gömlekli bonusdan bahsettin ;-)

Collection mergedList = Collections.list(new sun.misc.CompoundEnumeration(new Enumeration[] {
    new Vector(list1).elements(),
    new Vector(list2).elements(),
    ...
}))

neden birisi bunları asla kullanmasın?
David

5
@David çünkü JDK'da dahili olarak kullanılması amaçlanmıştır. Kodunuzda kullandıysanız, kodunuz büyük olasılıkla Sun olmayan (veya şimdi Oracle olmayan) JDK / JRE'de çalışmaz.
Adrian Shum

@AdrianShum Oracle'dan başka JDK'lar / JRE'ler var mı? Bu beni şaşırtacaktı. En yaygın API işlevselliğiyle sınırlı olsa bile, tüm öğelerin yeniden oluşturulması muhtemelen
yaşlanacaktır

1
Oldukça fazla JVM var. Girişim dünyasında en sık görülen kişi, iirc, websphere ile birlikte gelen IBM olmalıdır
Adrian Shum

0

Tek astarlı bir yol yok, ama bunun en basit olduğunu düşünüyorum:

List<String> newList = new ArrayList<String>(l1);
newList.addAll(l2);

for(String w:newList)
        System.out.printf("%s ", w);

0

Listeleriniz farklı türlere sahipse ve bunları başka bir tür listeyle birleştirmek istiyorsanız, akışları ve java 8'i kullanan bir yaklaşım.

public static void main(String[] args) {
    List<String> list2 = new ArrayList<>();
    List<Pair<Integer, String>> list1 = new ArrayList<>();

    list2.add("asd");
    list2.add("asdaf");
    list1.add(new Pair<>(1, "werwe"));
    list1.add(new Pair<>(2, "tyutyu"));

    Stream stream = Stream.concat(list1.stream(), list2.stream());

    List<Pair<Integer, String>> res = (List<Pair<Integer, String>>) stream
            .map(item -> {
                if (item instanceof String) {
                    return new Pair<>(0, item);
                }
                else {
                    return new Pair<>(((Pair<Integer, String>)item).getKey(), ((Pair<Integer, String>)item).getValue());
                }
            })
            .collect(Collectors.toList());
}

0

Bunu statik olarak yapmak istiyorsanız aşağıdakileri yapabilirsiniz.

Örnekler, doğal sırayla (== Enum-order) 2 EnumSets kullanır A, Bve ardından bir ALLlisteye katılır .

public static final EnumSet<MyType> CATEGORY_A = EnumSet.of(A_1, A_2);
public static final EnumSet<MyType> CATEGORY_B = EnumSet.of(B_1, B_2, B_3);

public static final List<MyType> ALL = 
              Collections.unmodifiableList(
                  new ArrayList<MyType>(CATEGORY_A.size() + CATEGORY_B.size())
                  {{
                      addAll(CATEGORY_A);
                      addAll(CATEGORY_B);
                  }}
              );

Bu yeni bir anonim sınıf yaratacaktır. Tavsiye edilmeyen yaklaşım!
kravemir

-3
import java.util.AbstractList;
import java.util.List;


/**
 * The {@code ConcatList} is a lightweight view of two {@code List}s.
 * <p>
 * This implementation is <em>not</em> thread-safe even though the underlying lists can be.
 * 
 * @param <E>
 *            the type of elements in this list
 */
public class ConcatList<E> extends AbstractList<E> {

    /** The first underlying list. */
    private final List<E> list1;
    /** The second underlying list. */
    private final List<E> list2;

    /**
     * Constructs a new {@code ConcatList} from the given two lists.
     * 
     * @param list1
     *            the first list
     * @param list2
     *            the second list
     */
    public ConcatList(final List<E> list1, final List<E> list2) {
        this.list1 = list1;
        this.list2 = list2;
    }

    @Override
    public E get(final int index) {
        return getList(index).get(getListIndex(index));
    }

    @Override
    public E set(final int index, final E element) {
        return getList(index).set(getListIndex(index), element);
    }

    @Override
    public void add(final int index, final E element) {
        getList(index).add(getListIndex(index), element);
    }

    @Override
    public E remove(final int index) {
        return getList(index).remove(getListIndex(index));
    }

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

    @Override
    public boolean contains(final Object o) {
        return list1.contains(o) || list2.contains(o);
    }

    @Override
    public void clear() {
        list1.clear();
        list2.clear();
    }

    /**
     * Returns the index within the corresponding list related to the given index.
     * 
     * @param index
     *            the index in this list
     * 
     * @return the index of the underlying list
     */
    private int getListIndex(final int index) {
        final int size1 = list1.size();
        return index >= size1 ? index - size1 : index;
    }

    /**
     * Returns the list that corresponds to the given index.
     * 
     * @param index
     *            the index in this list
     * 
     * @return the underlying list that corresponds to that index
     */
    private List<E> getList(final int index) {
        return index >= list1.size() ? list2 : list1;
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.