Преобразование списка в набор в Scala

#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)