반응형
리스트의 원소 비교는 자주 사용되는 작업 중 하나입니다. 이 글에서는 `validates`와 `values` 리스트의 비교 방법을 소개하고, 각각의 성능 차이를 분석합니다.
리스트 비교 방법 3가지
다음은 `values` 리스트의 모든 값이 `validates` 리스트에 포함되는지 확인하는 3가지 방법입니다. 각 방법은 동일한 결과를 반환하지만 성능에서 차이가 있습니다.
1. `values.stream().allMatch(validates::contains)`
첫 번째 방법은 `stream()`을 사용하여 `values`의 각 항목에 대해 `validates.contains()`를 호출하는 방식입니다. 이 방식은 리스트의 크기가 커질수록 성능이 떨어질 수 있습니다.
String validateValue = "apple;banana;cherry"; // validates 리스트에 들어갈 값 String value = "apple;banana"; // values 리스트에 들어갈 값 List validates = Arrays.asList(validateValue.split(";")); List values = value.contains(";") ? Arrays.asList(value.split(";")) : null; if (values != null && values.stream().allMatch(validates::contains)) { return true; // values의 모든 원소가 validates에 포함되면 true } else { return false; }
2. `validates.containsAll(values)`
두 번째 방법은 `containsAll()` 메소드를 사용하는 방법입니다. 이 방법도 내부적으로 `validates.contains()`를 반복 호출하므로 성능은 첫 번째 방법과 유사합니다.
String validateValue = "apple;banana;cherry"; // validates 리스트에 들어갈 값 String value = "apple;banana"; // values 리스트에 들어갈 값 List validates = Arrays.asList(validateValue.split(";")); List values = value.contains(";") ? Arrays.asList(value.split(";")) : null; if (values != null && validates.containsAll(values)) { return true; // values의 모든 원소가 validates에 포함되면 true } else { return false; }
3. `new HashSet<>(validates).containsAll(values)`
세 번째 방법은 `validates`를 `HashSet`으로 변환한 후, `containsAll()`을 사용하는 방법입니다. `HashSet`은 원소를 빠르게 찾을 수 있기 때문에 이 방법이 가장 효율적입니다.
String validateValue = "apple;banana;cherry"; // validates 리스트에 들어갈 값 String value = "apple;banana"; // values 리스트에 들어갈 값 List validates = Arrays.asList(validateValue.split(";")); List values = value.contains(";") ? Arrays.asList(value.split(";")) : null; if (values != null && new HashSet<>(validates).containsAll(values)) { return true; // values의 모든 원소가 validates에 포함되면 true } else { return false; }
성능 분석
각 방법의 성능 차이는 리스트의 크기가 커질수록 더 두드러집니다.
- `values.stream().allMatch(validates::contains)`: 시간 복잡도는 `O(m * n)`입니다. `values`의 각 항목에 대해 `validates.contains()`를 호출하므로 성능이 떨어질 수 있습니다.
- `validates.containsAll(values)`: 시간 복잡도는 `O(m * n)`입니다. 이 방법도 내부적으로 `contains`를 호출하므로 성능이 유사합니다.
- `new HashSet<>(validates).containsAll(values)`: 시간 복잡도는 `O(m + n)`입니다. `HashSet`을 사용하여 원소를 빠르게 찾을 수 있어 가장 효율적입니다.
반응형