Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 树集不尊重映射后的顺序_Scala_Map_Treeset - Fatal编程技术网

Scala 树集不尊重映射后的顺序

Scala 树集不尊重映射后的顺序,scala,map,treeset,Scala,Map,Treeset,我不知道如何解释/理解以下有关TreeSet和map函数的行为 我想我在拼图中漏掉了一块。对此事的任何解释都将受到欢迎 scala> class Person(val name: String, val age: Int) extends Ordered[Person]{ | def compare(that: Person) = { | val nameComparison = name.compareToIgnoreCase(that.name)

我不知道如何解释/理解以下有关TreeSet和map函数的行为

我想我在拼图中漏掉了一块。对此事的任何解释都将受到欢迎

scala> class Person(val name: String, val age: Int) extends Ordered[Person]{
     |   def compare(that: Person) = {
     |     val nameComparison = name.compareToIgnoreCase(that.name)
     |     if(nameComparison != 0){
     |       nameComparison
     |     }else{
     |       age.compareTo(that.age)
     |     }
     |   }
     |   override def toString = s"$name || $age"
     | }
defined class Person

scala> import scala.collection.immutable.TreeSet
import scala.collection.immutable.TreeSet

scala> val tsPersons = TreeSet(
     |   new Person("Vivi", 31),
     |   new Person("ViVi", 4),
     |   new Person("vivi", 14)
     | )//1) printed in expected order
tsPersons: scala.collection.immutable.TreeSet[Person] = TreeSet(ViVi || 4, vivi || 14, Vivi || 31)

scala> tsPersons.map(p => p) //2) printed in expected order
res0: scala.collection.immutable.SortedSet[Person] = TreeSet(ViVi || 4, vivi || 14, Vivi || 31)

scala> tsPersons.map(p => (p.name, p.age)) //3) order messed up
res1: scala.collection.immutable.SortedSet[(String, Int)] = TreeSet((ViVi,4), (Vivi,31), (vivi,14))

scala> tsPersons.toList.map(p => (p.name, p.age)) //4) printed in expected order
res2: List[(String, Int)] = List((ViVi,4), (vivi,14), (Vivi,31))
在打印“1”时,我可以看到tsPersons被正确排序

在打印“2”和“3”中,映射方法的元素顺序不一致

最后,在使用toList方法打印“4”时,我可以处理正确排序的列表,因此列表上的map方法可以很好地处理相同的函数literal
p=>(p.name,p.age)
,这在以前不起作用

我确信关于排序、树集或地图还有一些我不知道的东西


提前谢谢你的帮助

如果您了解
map
for
TreeSet
的工作原理,您将了解实际发生的情况。在
map
new
TreeSet
中创建并填充原始树集的转换元素。由于新树集将根据新元素自身的自然顺序对新元素进行排序,因此会得到混乱的结果

所以,在第二种情况下,用
Person
元素填充新树集,并根据Person的
compare
方法对它们进行排序

但是在第3种情况下,你会得到一个新的
TreeSet
,里面填充了元组,元组是按照元组的顺序排序的,也就是按第一个元组的元素排序,而第二个元素则打破了关系

在第四种情况下,首先将集合转换为列表,再次在
toList
内部创建新的列表生成器,并使用原始集合中的元素填充,保留顺序(因为列表是有序集合)。所以,当您在列表的元素上调用map时,初始顺序将被保留(对于树集和列表也是如此)


希望这能帮助你了解发生了什么。如果您仍然需要一些澄清,请不要犹豫。如果您了解
树集的
映射
工作原理,您将了解实际发生的情况。在
map
new
TreeSet
中创建并填充原始树集的转换元素。由于新树集将根据新元素自身的自然顺序对新元素进行排序,因此会得到混乱的结果

所以,在第二种情况下,用
Person
元素填充新树集,并根据Person的
compare
方法对它们进行排序

但是在第3种情况下,你会得到一个新的
TreeSet
,里面填充了元组,元组是按照元组的顺序排序的,也就是按第一个元组的元素排序,而第二个元素则打破了关系

在第四种情况下,首先将集合转换为列表,再次在
toList
内部创建新的列表生成器,并使用原始集合中的元素填充,保留顺序(因为列表是有序集合)。所以,当您在列表的元素上调用map时,初始顺序将被保留(对于树集和列表也是如此)


希望这能帮助你了解发生了什么。如果您还需要一些澄清,请不要犹豫。我必须说一个非常好的解释。现在一切都清楚了。非常感谢。我必须说一个很好的解释。现在一切都清楚了。非常感谢你。