gpt4 book ai didi

scala - TreeSet 映射后不遵守顺序

转载 作者:行者123 更新时间:2023-12-02 21:23:44 27 4
gpt4 key购买 nike

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

我想我遗漏了一 block 拼图。任何有关此事的线索都将受到欢迎。

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)”中,map 方法的元素顺序不一致。

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

我确信还有一些关于 Sorted、TreeSet 或 map 我不知道的事情。

提前感谢您的帮助!

最佳答案

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

因此,在第二种情况下,您用 Person 元素填充新的树集,并且它们按照 Person 的 compare 方法进行排序。

但在情况 #3 中,您会得到新的 TreeSet ,其中填充了根据元组顺序排序的元组,即按第一个元组的元素排序,并由第二个元素打破关系。

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

希望这能帮助您了解正在发生的事情。如果您仍需要一些说明,请随时询问。

关于scala - TreeSet 映射后不遵守顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26067027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com