Почему Scala Sets разного размера производят Итератор, заказанный по-разному? [Дубликат]

34
задан DNA 12 March 2015 в 12:25
поделиться

1 ответ

Библиотека коллекций Scala предоставляет специализированные реализации для наборов из менее 5 значений (см. источник ). Итераторы для этих реализаций возвращают элементы в том порядке, в котором они были добавлены , а не в согласованном порядке на основе хешей, используемом для больших наборов.

Кроме того, sameElements ( scaladoc ) определен на Iterable s (он реализован в IterableLike - см. источник ); он возвращает true, только если итераторы возвращают одни и те же элементы в одном порядке.

Итак, хотя Set(1,2,3) и Set(3,2,1) должны быть эквивалентными, их итераторы различны, поэтому sameElements возвращает false.

Такое поведение является неожиданным и, возможно, является ошибкой, поскольку оно нарушает математические ожидания для Set (но только для определенных размеров Set!).

As И.К. указывает на комментарии, == отлично работает, если вы просто сравниваете Sets друг с другом, то есть Set(1,2,3) == Set(3,2,1). Однако sameElements является более общим в том смысле, что он может сравнивать элементы любых двух итераций. Например, List(1, 2, 3) == Array(1, 2, 3) является ложным, но List(1, 2, 3) sameElements Array(1, 2, 3) является истинным.

В более общем плане, равенство может сбивать с толку - обратите внимание, что:

List(1,2,3) == Vector(1,2,3)
List(1,2,3) != Set(1,2,3)
List(1,2,3) != Array(1,2,3)      
Array(1,2,3) != Array(1,2,3)

У меня есть отправлено fix для упражнений Scala , которые объясняют проблему sameElements.

73
ответ дан DNA 28 August 2018 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: