Java에서 두 목록에 어떻게 참여합니까?


749

조건 : 원본 목록을 수정하지 마십시오. 외부 라이브러리가없는 JDK 전용 1 라이너 또는 JDK 1.3 버전의 보너스 포인트.

다음보다 간단한 방법이 있습니까?

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

5
반복 목적으로 만이 작업을 수행하는 경우 다른 질문이 있습니다. Google 구아바 및 Java 8 솔루션 stackoverflow.com/questions/4896662/…
Boris Treukhov

유틸리티 방법으로 자바 8 솔루션 : stackoverflow.com/a/37386846/1216775
akhil_mittal

답변 중 일부를 읽은 후 죄송합니다.
Anthony Rutledge

답변:


590

자바 8 :

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

82
Gawd, 그것은 Java 8의 문제입니까? 기술적으로 당신은 내가 추측 추측하지만, 그것은 긴 라인의 도대체 :-)
Robert Atkins

4
일반 독자를 위해 다음은 Java _ Streams를 사용하는 더 짧은 솔루션입니다. stackoverflow.com/a/34090554/363573
Stephan

7
그것은 추악하지만 적어도 유창하며 멀티 라인 람다없이 사용할 수 있습니다. 나는 연결 된 목록을 반환하는 유창한 addAll이 있었으면 좋겠다.
Usman Ismail

6
다음과 같이 별개의 목록을 얻는 것이 정말 쉽다는 점에 주목할 필요가 있습니다.List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).distinct().collect(Collectors.toList());
Roger

1
연결의 대안 : 개울의 흐름Stream.of(listOne, listTwo).flatMap(Collection::stream).collect(Collectors.toList())
Peter Walser

569

내 머리 꼭대기에서 한 줄씩 줄일 수 있습니다.

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

156
기술적으로 정확하지만 한 줄씩 단축했지만이 비대칭 성으로 인해 버그가 발생했습니다. 여분의 라인을 "보내기"더 행복합니다.
Robert Atkins

13
newList의 interal array가 listOne의 크기로 초기화되고 listTwo에서 모든 항목을 추가 할 때 잠재적으로 확장 해야하는 문제가 있습니까? 각 목록의 크기를 가져 와서 새 배열의 크기를 조정하는 것이 더 좋습니까?
Eric

2
이것이 나에게 가장 적합한 솔루션이었습니다. 나는 빈 목록을 만든 다음 addAll()두 가지 모두 와 함께 다른 솔루션의 성능을 비교했습니다 . 나는 목록을 복사하지 말 것을 제안하는 모든 것을 시도했으며 이번에는 필요하지 않은 많은 오버 헤드가 발생했습니다.
manuelvigarcia

멋지지만 더 짧게 만들 수도 있습니다. List list = new ArrayList <> (list1) .addAll (list2);
속도

1
@velocity : 아니요, 작동하지 않습니다. addAll(Collection)를 반환합니다 boolean.
Stijn Van Bael

306

Apache commons-collections 라이브러리를 사용할 수 있습니다 .

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

52
좋지만 아파치 공통점이 필요합니다. 그는 '외부 라이브러리 없음'을 지정했습니다
Quantum7

101
@ Quantum7, 여전히 다른 사람들에게 유용합니다;) 또한 아파치 공통점은 외부 라이브러리입니까? 그것 없이는 아무것도 시작하지 않습니다!
tster

28
문서에 따르면 @Platinum No. ListUtils.union은 OP 코드와 정확히 동일합니다. 그러나 목록 컨텍스트에서 SET 연산 ( "Union")을 사용하는 것은 잘못된 것입니다. 중복이나 무언가를 제거하는 방법을 알 수 있지만 방법이 그렇게하지 않는 것 같습니다.
Quantum7

24
Apache Commons Collection을 피하십시오. 형식이 안전하지 않으며 제네릭이 없습니다. Java 1.4를 사용하면 좋지만 Java 5 이상에서는 Google Guava를 선호합니다.
Michael Piefel

11
@MichaelPiefel 최신 Apache Commons Collections 4는 형식이 안전합니다. Java 8 메소드 참조를 사용하면 이러한 종류의 정적 유틸리티가 매우 중요해집니다.
mingfai

93

요구 사항 중 하나는 원본 목록을 유지하는 것입니다. 새 목록을 작성하고를 사용 addAll()하면 목록 의 객체에 대한 참조 수가 효과적으로 두 배가됩니다. 목록이 매우 큰 경우 메모리 문제가 발생할 수 있습니다.

연결된 결과를 수정할 필요가없는 경우 사용자 정의 목록 구현을 사용하여이를 피할 수 있습니다. 커스텀 구현 클래스는 두 줄 이상이지만 분명히 사용하는 것은 짧고 달콤합니다.

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

용법:

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

15
이것이이 질문에 대한 실제 답변입니다.
Wouter Lievens

9
이것은 가능한 솔루션이지만 기본 목록 개체가 변경되면 (list1, list2)이 목록의 내용이 변경됩니다. CompositeUnmodifiableList 자체 의 인스턴스를 수정하지 못할 수도 있지만 원래 목록에 대한 참조를 얻을 수있는 경우 가능합니다. 또한 익숙하지 않은 사용자의 경우 : 최종 수정자는 목록 객체 자체에 대한 참조 에만 영향을 미치므로 변경할 수는 없지만 목록의 내용은 변경 될 수 있습니다!
jwj

3
@ jwj 모두 아주 좋은 점 감사합니다. 클래스 이름은 아마도 약간의 설명이 필요합니다. 이 클래스는 Collections.unmodifiableList()메소드 와 매우 유사한 것을 수행하는 것으로보고 목록을 래핑하여 수정할 수 없도록 만듭니다. CompositeUnmodifiableList두 목록을 감싸고 연결된보기를 제공한다는 점을 제외하고는 동일한 작업을 수행합니다. 당신이 만드는 모든 포인트 CompositeUnmodifiableList도 마찬가지입니다 Collections.unmodifiableList().
Kevin K

2
생성자는이 걸릴 수 있습니다List<? extends E>
패트릭 파커에게

84

아마도 더 단순하지는 않지만 흥미롭고 추악합니다.

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

프로덕션 코드에서 사용하지 마십시오 ...;)


44
거의 모든 이중 괄호 초기화를 사용하는 것처럼 추악하고 악합니다. 그것은 더 짧지 만;)
Jorn

4
@MarnixKlooster : Eclipse 이를 사용해서는 안된다는 것을 알고 있으며 ;-) 사용하기가 불편합니다.
Joachim Sauer

20
그것은 실제로 한 줄이지 만, 나는 이것을 "한 줄짜리"라고 생각하지 않습니다.
splungebob

11
사람들이 익명의 블록 이니셜 라이저를 싫어하는 이유
NimChimpsky

18
@NimChimpsky 필자는 익명 블록 이니셜 라이저 일뿐 만 아니라 실제로 ArrayList의 익명 하위 클래스를 만들고 있기 때문이라고 생각합니다. 즉,이 Double Brace Initilization 질문 의 결과를 믿으면 DBI를 싫어하는 것이 대부분 문체 맛과 미세 최적화의 문제 인 것처럼 보입니다. 내가 알 수있는 한, 그것을하는 데 큰 처벌이 없습니다. 몰래 단점은 ArrayList가 아니기 때문에 클래스를 비교하려고 시도한 경우입니다.
Patrick

75

또 다른 Java 8 one-liner :

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

보너스 Stream.of()는 가변적이므로 원하는만큼 많은 목록을 연결할 수 있습니다.

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

35
x -> x.stream()로 대체 될 수 있습니다 Collection::stream.
Martin

10
... 또는로도 List::stream.
MC 황제

73

더 간단하지는 않지만 오버 헤드 크기를 조정하지 않은 경우 :

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

55

이 질문은 외부 라이브러리를 신경 쓰지 않고 임의의 양의 목록을 연결하려고합니다. 따라서 아마도 다른 사람을 도울 것입니다.

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

하나의 for ()에있는 여러 다른 컬렉션에 동일한 논리를 적용하려는 경우에 유용합니다.


9
예를 들면 다음과 같습니다. Lists.newArrayList (Iterables.concat (list1, list2));
meilechh

com.google.common.collect.Iterators#concat(java.util.Iterator<? extends java.util.Iterator<? extends T>>)대신에 전화해야합니다 Iterables#concat(); 나중에 여전히 요소를 임시 링크에 복사하기 때문입니다!
bob

45

자바 8 ( Stream.ofStream.concat)

제안 된 솔루션은 세 개의 목록에 대한 것이지만 두 개의 목록에도 적용될 수 있습니다. Java 8에서는 Stream.of 또는 Stream.concat 을 다음과 같이 사용할 수 있습니다 .

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.concat입력으로 두 개의 스트림을 가져 와서 요소가 첫 번째 스트림의 모든 요소와 두 번째 스트림의 모든 요소가 뒤섞인 지연 연결된 스트림을 만듭니다. 세 개의 목록이 있으므로이 방법 ( Stream.concat)을 두 번 사용했습니다.

varargs를 사용하여 여러 목록을 가져와 연결된 목록을 다음과 같이 반환하는 메서드를 사용하여 유틸리티 클래스를 작성할 수도 있습니다 .

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

그런 다음이 방법을 다음과 같이 사용할 수 있습니다.

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

List <String> result1 = Stream.concat (Stream.concat (list1.stream (), list2.stream ()), list3.stream ()). collect (Collectors.toList ()); 첫 번째 운영자. 고쳐주세요.
WebComer

44

다음은 두 줄을 사용하는 Java 8 솔루션입니다.

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

이 방법을 사용하면 안됩니다

  • 의 출처를 newList알 수 없으며 이미 다른 스레드와 공유되었을 수 있습니다
  • 수정하는 스트림 newList은 병렬 스트림이며 이에 대한 액세스 newList는 동기화되거나 스레드로부터 안전하지 않습니다.

부작용 고려로 인해.

위의 두 조건이 위의 두 목록에 참여하는 경우에는 적용되지 않으므로 안전합니다.

다른 질문 에 대한 이 답변 을 바탕으로 합니다 .


12
내가 틀리지 않으면 실제로 권장하지 않습니다-docs.oracle.com/javase/8/docs/api/java/util/stream/… 부작용-섹션을 참조하십시오. > 스트림 작동에 대한 동작 매개 변수의 부작용은 일반적으로 무단으로 무국적 요구 사항 위반 및 기타 스레드 안전 위험을 초래할 수 있으므로 권장하지 않습니다. 따라서이 경우 Collectors.toList ()를 사용하는 것이 좋습니다
Anton Balaniuc

@AntonBalaniuc 질문은 이것이 실제로 부작용인지 여부입니다. 이 시점에서 newList다른 스레드는 관찰 할 수 없습니다. 그러나 값이 어디에서 newList왔는지 알 수없는 경우 (예 newList: 매개 변수로 전달 된 경우) 이 작업을 수행하지 않아야합니다 .
SpaceTrucker

2
궁금해; 왜 .forEach(newList::addAll);대신에 .collect(Collectors.toList());?
11684

4
콜렉터가을 수집하기 때문에 @ 11684 List<List<Object>>입니다. 당신이 생각할 수있는 것은 다음과 같습니다 : stackoverflow.com/questions/189559/…
SpaceTrucker

@SpaceTrucker 죄송합니다, 나는 그것을 간과했습니다. 혼란을 해결해 주셔서 감사합니다. 그렇습니다 flatMap.
11684

34

이것은 간단하고 단 한 줄이지 만 listTone의 내용을 listOne에 추가합니다. 내용을 세 번째 목록에 넣어야합니까?

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

11
원본 목록을 수정하지 않는 것이 기준 중 하나 였지만 제약 조건이 아닌 상황에 대한 예제로 여기에 유용합니다.
Robert Atkins

1
감사합니다, 또는 더 간단한 listOne.addAll (listTwo)
Jay

27

약간 더 간단합니다 :

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

이로 인해 중복 문자열이 발생합니까? 두 목록에 존재하는 문자열이 결과 목록에 두 번 존재한다는 것을 의미합니까?
AgentKnopf

4
@Zainodis 네, 중복이있을 수 있습니다. 이 List구조에는 고유성 제한이 없습니다. 세트로 동일한 작업을 수행하여 듀피를 제거 할 수 있습니다. Set<String> newSet = new HashSet<>(setOne); newSet.addAll(setTwo);
Patrick

20

조금 더 짧을 것입니다 :

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

17

일반 Java 8 유틸리티 메소드를 작성하여 원하는 수의 목록을 연결할 수 있습니다 .

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

13

대상 목록이 미리 선언 된 경우 oneliner를 수행 할 수 있습니다.

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


9

솔루션이 이미 게시되어 Java8있으므로 스트림 을 사용하는 또 하나의 라이너 솔루션 flatMap입니다.flatMap

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

또는

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

암호

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

산출

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

1
flatMap목록을 수집 할 때 한 번만 반복되기 때문에이 솔루션은 아마도을 사용하는 솔루션보다 성능이 우수 할 것입니다.
Stefan Haberl

7

내 의견으로는 가장 똑똑하다.

/**
 * @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
잊지 마세요 @SafeVarargs!
Radon Rosborough

6

정적 가져 오기 및 도우미 클래스를 사용하여 수행 할 수 있습니다.

NB 이 클래스의 총칭 아마 개선 될 수

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

}

그럼 당신은 같은 일을 할 수 있습니다

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

정적 가져 오기 또는 헬퍼 클래스는 어떤 관련이 있습니까?
shmosel 2016 년

6

객체 키로 결합을 지원하는 Java 8 버전 :

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

헬퍼 클래스를 사용하십시오.

나는 제안한다 :

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

우리는 두 가지 접근 방식으로 java8을 사용하여 두 목록에 참여할 수 있습니다.

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

1) concat 사용 :

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

2) flatMap 사용 :

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

1
열세 살짜리 질문에 30 개의 다른 답변으로 답변 할 때, 답변의 새로운 측면이 무엇인지 지적하고, 질문을 받았을 때 이러한 기술이 효과가 있었는지 또는 그 기능에 의존했는지 여부를 확인하십시오 수년에 걸쳐 소개되었습니다.
Jason Aller

2

대부분의 답변은 ArrayList를 사용하는 것이 좋습니다.

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

효율적인 추가 작업을 위해 LinkedList를 사용하는 것이 좋습니다.

ArrayList add는 O (1) 상각되지만 배열의 크기를 조정하고 복사해야하므로 O (n) 최악의 경우입니다. LinkedList add는 항상 상수 O (1)입니다.

더 많은 정보 https://stackoverflow.com/a/322742/311420


0

나는 그것이 간단하다고 주장하지는 않지만 원 라이너에 대한 보너스를 언급했다. ;-)

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

왜 누군가가 그것들을 사용해서는 안됩니까?
David

5
@David는 JDK에서 내부적으로 사용되기 때문에 코드에서이 코드를 사용한 경우 코드가 Sun 이외의 (또는 현재 Oracle 이외의) JDK / JRE에서 실행되지 않을 수 있습니다.
Adrian Shum

@AdrianShum Oracle 이외의 다른 JDK / JRE가 있습니까? 그것은 나를 놀라게 할 것입니다. 가장 일반적인 API 기능으로 제한 되더라도 전체를 재 구축하는 데 시간이 오래 걸릴 것입니다.
Egor Hans

1
꽤 많은 JVM이 있습니다. 기업의 세계에서 가장 일반적으로 볼 수 하나는 웹 스피어와 함께 번들로 IIRC, 인 IBM 일,해야
아드리안 셤

0

한 줄짜리 근처에는 방법이 없지만 이것이 가장 간단하다고 생각합니다.

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

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

0

목록에 다른 유형이 있고 다른 유형의 목록과 결합하려는 경우 스트림과 Java 8을 사용하는 접근 방식이 있습니다.

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

이 작업을 정적으로 수행하려면 다음을 수행 할 수 있습니다.

이 예제에서는 자연 순서 (== 순)로 2 개의 EnumSet을 사용 A, B하고 ALL목록 에서 조인 합니다.

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

이것은 새로운 익명 클래스를 만들 것입니다. 권장되지 않는 접근 방식!
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;
    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.