আমার একটি মানচিত্র রয়েছে 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
। জাভাতে হাশম্যাপ থেকে ডুপ্লিকেট মানগুলি মুছে ফেলার
Stream
এস এর মাধ্যমে কি করা উচিত ?