#scala
#scala #Коллекции
Вопрос:
Мне нужно преобразовать List
в Set
, но по порядку. Но я получаю набор, который не в порядке.
def toset(list: List[Int]): Int = {
var newset = Set.empty[Int]
for (i <- list){
newset = i
}
}
Тогда, если я сделаю list = List[Int] (4,6,2,1,7)
и toset(list)
, я получу newset = Set(1,6,2,7,4)
вместо newset = Set (4,6,2,1,7)
Комментарии:
1. Наборы неупорядочены, поэтому ваш код правильный, просто ненужный. Вы можете просто
list.toSet
.2.
Set
по определению это неупорядоченные коллекции. Вы не можете упорядочить их, но вы можете отсортировать их в соответствии сOrdering
, если вы используетеSortedSet
. Если для вас важен порядок,List
s и другиеSeq
являются правильным типом.
Ответ №1:
Вы можете использовать LinkedHashSet. Это упорядоченный (не отсортированный) тип набора, который соответствует порядку вставки.
Также в Scala вам не нужен традиционный цикл for для преобразования между типами коллекций. Вы можете просто использовать to(Factory)
такой метод, как:
val list = List(4,6,2,1,7)
list.to(collection.mutable.LinkedHashSet)
//Returns LinkedHashSet(4,6,2,1,7)
Вы также можете технически использовать immutable.ListSet
, но на данный момент это оказалось неэффективным (см. Здесь)
Ответ №2:
Set по определению являются неупорядоченными коллекциями.
Если вы хотите отсортировать, Set
вам нужно использовать SortedSet
класс, но он будет сортировать элементы с помощью неявной функции сортировки в зависимости от типов элементов. Это не сохранит исходный порядок списка:
val list = List[Int] (4,6,2,1,7)
list: List[Int] = List(4, 6, 2, 1, 7)
collection.SortedSet(list:_ *)
res2: scala.collection.SortedSet[Int] = TreeSet(1, 2, 4, 6, 7)