У меня есть несортированный список, и я хочу знать, являются ли все элементы в нем уникальными.
Мой наивный подход будет
<code>val l = List(1,2,3,4,3)
def isUniqueList(l: List[Int]) = (new HashSet()++l).size == l.size
По сути, я проверяю,Набор, содержащий все элементы списка, имеет одинаковый размер (поскольку элемент, появляющийся дважды в исходном списке, появится только один раз в наборе), но я не уверен, является ли это идеальным решением для этой проблемы.
Редактировать: Я протестировал 3 самых популярных решения, l==l.distinct
, l.size==l.distinct.size
и решение Алексея на основе HashSet.Каждая функция была запущена 1000 раз с уникальным списком из 10 элементов, уникальным списком из 10000 элементов и теми же списками с одним элементом, появляющимся в третьем квартале, скопированным в середину списка.Перед каждым запуском каждую функцию вызывали 1000 раз для разогрева JIT, весь тест выполнялся 5 раз, прежде чем время было взято с System.currentTimeMillis.Машина представляла собой C2D P8400 (2,26 ГГц) с 3 ГБ ОЗУ, java-версией была 64-битная виртуальная машина OpenJDK (1.6.0.20).Аргументы java были -Xmx1536M -Xms512M
Результаты:
l.size==l.distinct.size (3, 5471, 2, 6492)
l==l.distinct (3, 5601, 2, 6054)
Alexey's HashSet (2, 1590, 3, 781)
Результаты с более крупными объектами (строки от 1 КБ до 5 КБ):
l.size==l.distinct.size MutableList(4, 5566, 7, 6506)
l==l.distinct MutableList(4, 5926, 3, 6075)
Alexey's HashSet MutableList(2, 2341, 3, 784)
Решениеиспользование HashSets, безусловно, является самым быстрым, и, как он уже отметил, использование .size не имеет большого значения.