Java에서 목록 반전 – 제자리 및 외부

이 짧은 자습서에서는 Java에서 제자리 및 외부 목록을 뒤집는 방법을 배웁니다.

제자리와 제자리에서 반전

목록에 대한 작업을 수행할 때 - 작업이 제자리에서 수행되는지(변경 사항이 원래 개체에 적용됨) 또는 제자리에 있지 않은지(변경 사항이 복사본에 적용되고 원본에 적용되는지 여부)를 고려할 수 있습니다. 객체는 변경되지 않음).

일부 언어 및 라이브러리는 다른 기본 동작을 선호합니다. Java에서 목록 반전에 대한 대부분의 작업은 다음과 같습니다. 그 자리에서.

이것이 원하는 행동이라면 – 좋습니다! 그렇지 않은 경우 복사본을 되돌리기 전에 목록의 복사본을 만드는 것이 좋습니다.

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

참고 : XNUMXD덴탈의 clone() 방법 하지 않습니다 깊은 복사본을 만듭니다. 다음을 사용하여 목록 만들기 new ArrayList(list) 하지 않습니다 깊은 복사본을 만듭니다. 깊은 복사본을 만드는 것은 권장되지 않으며 일반적으로 수행하기가 놀랍도록 어렵습니다(목록의 데이터 유형에 따라 어떤 경우에는 의미가 없음). 이것은 당신이 되돌릴 수 있는 것을 멈추지 않을 것입니다 list지원 의 요소를 가지고 listCopy 역전되지만.

컬렉션.리버스()

XNUMXD덴탈의 Collections.reverse() method는 컬렉션을 뒤집기 위한 표준 방법이며 "누락"으로 작동합니다. List.reverse() 방법. 목록을 제자리에서 뒤집습니다.

List list = new ArrayList(Arrays.asList(1, 2, 3));
List listCopy = new ArrayList(list);

Collections.reverse(list);

System.out.println(list);     
System.out.println(listCopy); 

구아바의 Lists.reverse(list)

프로젝트에서 이미 Google Guava를 사용하고 있다면 Lists 제공하는 클래스, reverse() 원본 목록을 제자리에서 정렬하지 않지만 복사본을 만들고 복사본을 뒤집는 메서드:

List list = new ArrayList(Arrays.asList(1, 2, 3));
List reversedList = Lists.reverse(list);

System.out.println(list);         
System.out.println(reversedList); 

아직 없는 경우 Maven을 사용하여 프로젝트에 Google Guava의 종속성을 포함하여 프로젝트에 추가할 수 있습니다. pom.xml 파일 :

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
</dependency>

또는 Gradle을 통해:

implementation group: 'com.google.guava', name: 'guava'

참고 : Google Guava가 아직 없거나 프로젝트의 다른 부분에 사용할 계획이 없다면 – 이 작업을 위해서만 가져오지 말고 Collections.reverse() 방법. 구아바는 큰 의존성이며 이 작업에만 사용하는 것은 과도합니다.

List.add() 및 List.remove()

목록을 뒤집는 것 외에 추가 작업을 수행하려면 원래 목록을 반복하고, 끝에서 요소를 제거하고, 임의의 방법을 통해 전달하고, 목록의 시작 부분에 다시 추가할 수 있습니다.


public static int process(int input) {
    return input;
}

List list = new ArrayList(Arrays.asList(1, 2, 3));

for (int i = 0, j = list.size()-1; i <= j; i++) {
    int lastValue = process(list.remove(j));
    list.add(i, lastValue);
}

System.out.println(list);  

기준

그래서, 어느 것이 가장 빠릅니까? 이것은 또한 작업을 제자리에서 수행할지 아니면 외부에서 수행할지에 따라 다릅니다.

제자리 반전 벤치마크

out-of-place부터 시작하여 세 가지 방법 모두에 대해 두 가지 접근 방식을 모두 벤치마킹해 보겠습니다.

List list = new Random().ints(100, 1, 11)
                .boxed()
                .collect(Collectors.toList());

int runs = 1000;

long start1 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListCollections(list);
}
long end1 = System.currentTimeMillis();
System.out.println(String.format("Collections.reverse() took: %s miliseconds", end1-start1));

long start2 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListGuava(list);
}
long end2 = System.currentTimeMillis();
System.out.println(String.format("Guava's Lists.reverse() took: %s miliseconds", end2-start2));

long start3 = System.currentTimeMillis();
for (int i = 0; i < runs; i++) {
    reverseListManually(list);
}
long end3 = System.currentTimeMillis();
System.out.println(String.format("Manually took: %s miliseconds", end3-start3));

System.out.println("Original list: " + list);

결과 :

Collections.reverse() took: 3 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 13 miliseconds
Original list: [6, 7, 9, 7, 2, 5, 4, 1, 3, 2, 2, 6, ...

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

요소의 수를 100에서 1000으로 늘리면 어떻게 될까요?

Collections.reverse() took: 9 miliseconds
Guava's Lists.reverse() took: 4 miliseconds
Manually took: 133 miliseconds
Original list: [10, 2, 2, 6, 2, 4, 7, 3, 9, 2, 7, 5, ...

구아바는 4ms 마크를 유지합니다! 수동 접근 방식은 시간 복잡도가 가장 낮고 선형적으로 증가했습니다. Collections.reverse() 규모 확장으로 인한 어려움은 덜하지만 Guava의 구현은 가장 적은 어려움을 겪습니다. 그러나 Guava 접근 방식에 대한 목록을 수동으로 복사하지 않는다는 점에 유의하십시오. "원래" 목록과 "반대" 목록이 있다는 생각을 버리면 벤치마크가 변경됩니까?

Out-Of-Place 반전 벤치마크

1000개의 요소가 있고 각 방법에서 수동 사본을 제거하고 코드를 다시 실행할 때 목록의 반전되지 않은 사본(시간 측정에서 제외됨)에서 작동합니다.

Collections.reverse() took: 7 miliseconds
Guava's Lists.reverse() took: 3 miliseconds
Manually took: 131 miliseconds
Original list: [6, 8, 10, 7, 3, 8, 7, 1, 1, 9, 5, ...

구아바 여전히 두 가지 모두를 지속적으로 능가합니다. Collections.reverse() 그리고 수동 접근.

결론

이 짧은 가이드에서는 작업에서 원래 목록을 유지하면서 제자리 및 외부에서 Java의 목록을 뒤집는 방법을 배웠습니다. 우리는 사용했습니다 Collections.reverse() 방법, 구글 구아바의 Lists.reverse() 방법 및 수동 접근.

타임 스탬프 :

더보기 스택카부스