Scala 树集不尊重映射后的顺序
我不知道如何解释/理解以下有关TreeSet和map函数的行为 我想我在拼图中漏掉了一块。对此事的任何解释都将受到欢迎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)
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方法可以很好地处理相同的函数literalp=>(p.name,p.age)
,这在以前不起作用
我确信关于排序、树集或地图还有一些我不知道的东西
提前谢谢你的帮助 如果您了解
map
forTreeSet
的工作原理,您将了解实际发生的情况。在map
newTreeSet
中创建并填充原始树集的转换元素。由于新树集将根据新元素自身的自然顺序对新元素进行排序,因此会得到混乱的结果
所以,在第二种情况下,用Person
元素填充新树集,并根据Person的compare
方法对它们进行排序
但是在第3种情况下,你会得到一个新的TreeSet
,里面填充了元组,元组是按照元组的顺序排序的,也就是按第一个元组的元素排序,而第二个元素则打破了关系
在第四种情况下,首先将集合转换为列表,再次在toList
内部创建新的列表生成器,并使用原始集合中的元素填充,保留顺序(因为列表是有序集合)。所以,当您在列表的元素上调用map时,初始顺序将被保留(对于树集和列表也是如此)
希望这能帮助你了解发生了什么。如果您仍然需要一些澄清,请不要犹豫。如果您了解
树集的映射工作原理,您将了解实际发生的情况。在map
newTreeSet
中创建并填充原始树集的转换元素。由于新树集将根据新元素自身的自然顺序对新元素进行排序,因此会得到混乱的结果
所以,在第二种情况下,用Person
元素填充新树集,并根据Person的compare
方法对它们进行排序
但是在第3种情况下,你会得到一个新的TreeSet
,里面填充了元组,元组是按照元组的顺序排序的,也就是按第一个元组的元素排序,而第二个元素则打破了关系
在第四种情况下,首先将集合转换为列表,再次在toList
内部创建新的列表生成器,并使用原始集合中的元素填充,保留顺序(因为列表是有序集合)。所以,当您在列表的元素上调用map时,初始顺序将被保留(对于树集和列表也是如此)
希望这能帮助你了解发生了什么。如果您还需要一些澄清,请不要犹豫。我必须说一个非常好的解释。现在一切都清楚了。非常感谢。我必须说一个很好的解释。现在一切都清楚了。非常感谢你。