Вы можете использовать потоки Java с одним слоем:
public static boolean test(String[] value) {
return Arrays.stream(value).anyMatch(v -> Collections.frequency(Arrays.asList(value), v) > 1);
}
Но это, вероятно, не самое эффективное решение, поскольку оно имеет временную сложность O (n²).
В качестве альтернативы вы можете использовать distinct()
:
public static boolean test(String[] value) {
return Arrays.stream(value).distinct().count() < value.length;
}
Если вы хотите получить повторяющиеся значения, вы можете комбинировать оба метода:
public static String[] getDuplicates(String[] value) {
return Arrays.stream(value)
.filter(v -> Collections.frequency(Arrays.asList(value), v) > 1)
.distinct()
.toArray(String[]::new);
}
Эта версия также имеет временную сложность O(n²) из-за количества frequency()
.Лучшее решение было бы:
public static String[] getDuplicates(String[] value) {
return Arrays.stream(value)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.filter(e -> e.getValue() > 1)
.map(Map.Entry::getKey)
.toArray(String[]::new);
}