Java List 또는 Collection 최대/최소 찾기
1. 정수 목록에서 최대값 찾기
메서드 참조를 허용하는 java.util.Stream
인터페이스 를 통해 제공되는 max()
메서드를 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void whenListIsOfIntegerThenMaxCanBeDoneUsingIntegerComparator() {
// given
List<Integer> listOfIntegers = Arrays.asList(1, 2, 3, 4, 56, 7, 89, 10);
Integer expectedResult = 89;
// then
Integer max = listOfIntegers
.stream()
.mapToInt(v -> v)
.max().orElseThrow(NoSuchElementException::new);
assertEquals("Should be 89", expectedResult, max);
}
코드를 살펴본다.
List에서
stream()
메서드를 호출하여 목록에서 값 스트림 가져온다.정수 스트림을 얻기 위해 스트림에서
mapToInt(value -> value)
호출한다.최대 값을 얻기 위해 스트림에서
max()
메서드 호출한다.orElseThrow()
를 호출하여max()
에서 값을 받지 못한 경우 예외 발생한다.
2. 사용자 지정 개체로 최소값 찾기
사용자 지정 개체에서 최소/최대를 찾기 위해 선호하는 정렬 논리에 대한 람다 식을 제공할 수 있다.
먼저 사용자 지정 POJO를 정의한다.
1
2
3
4
5
6
class Person {
String name;
Integer age;
// standard constructors, getters and setters
}
최소 연령의 Person 객체를 찾고자 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public void whenListIsOfPersonObjectThenMinCanBeDoneUsingCustomComparatorThroughLambda() {
// given
Person alex = new Person("Alex", 23);
Person john = new Person("John", 40);
Person peter = new Person("Peter", 32);
List<Person> people = Arrays.asList(alex, john, peter);
// then
Person minByAge = people
.stream()
.min(Comparator.comparing(Person::getAge))
.orElseThrow(NoSuchElementException::new);
assertEquals("Should be Alex", alex, minByAge);
}
코드를 살펴본다.
목록에서
stream()
메서드를 호출하여 목록에서 값 스트림 가져온다.스트림에서
min()
메서드를 호출하여 최소값을 가져온다. 람다 함수를 비교자로 전달하고 이것은 최소값을 결정하기 위한 정렬 논리를 결정하는 데 사용된다.min()
에서 값을 받지 못한 경우orElseThrow()
를 호출하여 예외 발생한다.
3. 인덱스 번호와 함께 ArrayList에서 최소/최대 찾기
ArrayList의 최소값 또는 최대값을 결정하기 위해 앞에서 본 메서드 또는 Java Collections 클래스의 min()
및 max()
메서드를 사용할 수 있다. 이러한 메서드는 각각 지정된 컬렉션의 최소 및 최대 요소를 반환한다.
또한 ArrayList 클래스의 indexOf()
메서드를 사용하여 목록의 요소 인덱스를 가져올 수 있다. 이 메서드는 목록에서 요소가 처음 나타나는 인덱스를 반환한다.
예제 이다.
1
2
3
4
5
6
7
8
9
List<Integer> listOfIntegers = Arrays.asList(11, 13, 9, 20, 7, 3, 30);
Integer expectedMinValue = 3;
Integer expectedMinIndex = 5;
Integer minValue = Collections.min(listOfIntegers);
Integer minIndex = listOfIntegers.indexOf(minValue);
assertEquals(minValue, expectedMinValue);
assertEquals(minIndex, expectedMinIndex);
먼저 값을 저장할 Integer 목록을 정의한다. 그런 다음 Collections.min()
을 사용하여 목록의 최소값을 가져온다. 이 경우 이 값은 3이다. 마지막으로 listOfIntegers.indexOf()
를 사용하여 목록에서 이 값의 인덱스를 가져온다. 여기서는 5이다.