여기서의 요령은 "리버스"를 정의하는 것입니다. 목록을 제자리에서 수정하거나, 복사본을 역순으로 만들거나, 역순으로보기를 만들 수 있습니다.
직관적으로 말하면 가장 간단한 방법 은 Collections.reverse
다음과 같습니다.
Collections.reverse(myList);
이 방법 은 목록을 수정합니다 . 즉, Collections.reverse
목록을 가져 와서 요소를 덮어 쓰므 로 되돌릴 수없는 사본은 남기지 않습니다. 일부 사용 사례에는 적합하지만 다른 사용 사례에는 적합하지 않습니다. 또한 목록을 수정할 수 있다고 가정합니다. 이것이 받아 들여지면 좋다.
그렇지 않은 경우 사본을 역순으로 만들 수 있습니다 .
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
이 방법은 효과가 있지만 목록을 두 번 반복해야합니다. 복사 생성자 ( new ArrayList<>(list)
)는 목록을 반복하며 Collections.reverse
. 우리가 기울어지면이 방법을 한 번만 반복하도록 다시 작성할 수 있습니다.
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
이것은 더 효율적이지만 더 장황합니다.
또는 Java 8의 stream
API 를 사용하기 위해 위의 내용을 다시 작성할 수 있습니다. 일부 사람들 은 위의 것보다 간결하고 읽기 쉽습니다.
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
nb. 그 Collectors.toList()
결과 목록에 대한 거의 보장한다. 결과가 ArrayList로 돌아 오도록하려면 Collectors.toCollection(ArrayList::new)
대신 사용하십시오.
세 번째 옵션은 역순으로보기 를 만드는 것 입니다. 이것은 더 복잡한 해결책이며, 더 읽을 거리 / 자신의 질문에 합당합니다. 구아바의 Lists # reverse 방법은 실행 가능한 출발점입니다.
"가장 간단한"구현을 선택하는 것은 독자를위한 연습으로 남아 있습니다.