나는지도를 가지고 있으며 Map<K, V>
목표는 중복 된 값을 제거하고 동일한 구조를 Map<K, V>
다시 출력하는 것 입니다. 중복 값이 발견되는 경우, 하나의 키 (이 선택해야합니다 k
두 개의 키 (에서) k1
하고 k1
이 값을 유지),이 이유로 가정 BinaryOperator<K>
주는 k
에서 k1
하고 k2
사용할 수 있습니다.
입력 및 출력 예 :
// Input
Map<Integer, String> map = new HashMap<>();
map.put(1, "apple");
map.put(5, "apple");
map.put(4, "orange");
map.put(3, "apple");
map.put(2, "orange");
// Output: {5=apple, 4=orange} // the key is the largest possible
사용하여 내 시도 Stream::collect(Supplier, BiConsumer, BiConsumer)
입니다 조금 아주 서투른와 같은 가변 작업을 포함 Map::put
하고 Map::remove
내가 피하고자하는을 :
// // the key is the largest integer possible (following the example above)
final BinaryOperator<K> reducingKeysBinaryOperator = (k1, k2) -> k1 > k2 ? k1 : k2;
Map<K, V> distinctValuesMap = map.entrySet().stream().collect(
HashMap::new, // A new map to return (supplier)
(map, entry) -> { // Accumulator
final K key = entry.getKey();
final V value = entry.getValue();
final Entry<K, V> editedEntry = Optional.of(map) // New edited Value
.filter(HashMap::isEmpty)
.map(m -> new SimpleEntry<>(key, value)) // If a first entry, use it
.orElseGet(() -> map.entrySet() // otherwise check for a duplicate
.stream()
.filter(e -> value.equals(e.getValue()))
.findFirst()
.map(e -> new SimpleEntry<>( // .. if found, replace
reducingKeysBinaryOperator.apply(e.getKey(), key),
map.remove(e.getKey())))
.orElse(new SimpleEntry<>(key, value))); // .. or else leave
map.put(editedEntry.getKey(), editedEntry.getValue()); // put it to the map
},
(m1, m2) -> {} // Combiner
);
Collectors
한 번의 Stream::collect
통화 내에서 적절한 조합을 사용하는 솔루션이 있습니까 (예 : 변경 가능한 작업 없음)?
Map::put
또는 Map::remove
내 Collector
.
BiMap
있습니다. 아마도 Java의 HashMap에서 중복 값 제거
Stream
s를 통해 수행되지 않아야 합니까?