Size: a a a

Java/Kotlin and more

2021 March 19

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
Я же сказал, что гуава реализована по алогритму, который описал человек сообщением выше.

А для того, чтобы сделать retainAll, нужно сначала map.keySet() добавить в новый HashSet. Если не добавить, то испортишь оригинальную мапу.
Оу, по легче, я бы посоветовал подумать над фразой что кейсет менять не стоит)
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Alexandr Emelyanov
Оу, по легче, я бы посоветовал подумать над фразой что кейсет менять не стоит)
М? Не понял, о чем вы)
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
Ну т.е. если 2 мапы по миллиону элементов, и 3 совпадающих, то гуава будет намного эффективнее. Особенно по памяти.
Эм. Не думаю
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
М? Не понял, о чем вы)
У мапы под капотом нет никакого сета ключей, так что меняя сет, который возвращает keySet(), ничего не сломаешь в мапе
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Alexandr Emelyanov
var intersection = map1.keySet().retainAll(map2.keySet())
Вот это решение - неприемлемое, если вы не хотите испортить map1.
потому что map1.keySet() вернет live view

по сути нужно делать так

var intersection = new HashSet(map1.keySet())
intersection.retainAll(map2.keySet())
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
Вот это решение - неприемлемое, если вы не хотите испортить map1.
потому что map1.keySet() вернет live view

по сути нужно делать так

var intersection = new HashSet(map1.keySet())
intersection.retainAll(map2.keySet())
Какой live view, ты чего)
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Alexandr Emelyanov
У мапы под капотом нет никакого сета ключей, так что меняя сет, который возвращает keySet(), ничего не сломаешь в мапе
так keySet() и не возращает сет ключей из-под капота мапы)
оно возвращает лайв-итератор по нодам мапы. и iterator.remove() у этого сета переопределен так, что удаляет ноду из мапы
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Alexandr Emelyanov
Какой live view, ты чего)
нооо... вообще я код смотрел. думал мб правда ошибся. Но нет же, вон даже в доках по этому методу написано:

Returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll, and clear operations. It does not support the add or addAll operations.
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
так keySet() и не возращает сет ключей из-под капота мапы)
оно возвращает лайв-итератор по нодам мапы. и iterator.remove() у этого сета переопределен так, что удаляет ноду из мапы
Первый раз что то такое слышу. Вообще то там должен вернуться сет, просто собранный по ключам из бакетов, при этом он никак не связан и операции над ним никак не аффектят мап. Ты где читал это?)
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Alexandr Emelyanov
Первый раз что то такое слышу. Вообще то там должен вернуться сет, просто собранный по ключам из бакетов, при этом он никак не связан и операции над ним никак не аффектят мап. Ты где читал это?)
в жавадоках от метода keySet() у класса HashMap
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
ну и в коде jdk. сначала в коде, потом оказалось, что в доках-то все уже описано)
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
в жавадоках от метода keySet() у класса HashMap
Видимо никогда и не сталкивался ибо по keySet, values и entrySet всегда беру сразу стрим)

Ну ок, будем в курсе
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Опять таки проще простого сделать фильтр по стриму и получить пересечение)
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Три строчки
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Ну собственно поэтому этот подход так себе если совпадений мало, а мапа большая.

Ну, собственно, если бы даже keySet() создавал новый сет, все равно подход был бы так себе, ведь этот новый сет с миллионом элементов все еще нужно создать. Гуава же просто бежит итератором по 1му сету и делает set2.contains(), грубо говоря. И возвращает тоже live view set-а, который "содержит" общие элементы из двух
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Alexandr Emelyanov
Опять таки проще простого сделать фильтр по стриму и получить пересечение)
ну да, можно сделать стрим, фильтр, коллект. но зачем? когда есть готовый метод
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
Ну собственно поэтому этот подход так себе если совпадений мало, а мапа большая.

Ну, собственно, если бы даже keySet() создавал новый сет, все равно подход был бы так себе, ведь этот новый сет с миллионом элементов все еще нужно создать. Гуава же просто бежит итератором по 1му сету и делает set2.contains(), грубо говоря. И возвращает тоже live view set-а, который "содержит" общие элементы из двух
Так с гуавой получится то же самое что и на стримах
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
ну да, можно сделать стрим, фильтр, коллект. но зачем? когда есть готовый метод
Ну не все и не всегда приветствуют для простых задач тянуть целый библиотеки
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Alexandr Emelyanov
Так с гуавой получится то же самое что и на стримах
Да, но гуава при этом не создает новый сет) Она так же возвращает live view с итератором, делающим этот перебор. так что в зависимости от того, что потом надо делать с этим сетом, может быть эффективнее.
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ну и читателю проще, который с этой же гуавой и не знаком. Её популярность стремиться к нулю
источник