加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:我可以依靠Set中的项目顺序吗?

发布时间:2020-12-16 09:43:38 所属栏目:安全 来源:网络整理
导读:这是一个不起眼的惊喜: scala Set(1,2,3,4,5) res18: scala.collection.immutable.Set[Int] = Set(4,5,1,3)scala Set(1,5).toListres25: List[Int] = List(5,4) 这个例子本身就是对我的问题提出了一个“不”的答案。那么ListSet呢? scala import scala.col
这是一个不起眼的惊喜:

scala> Set(1,2,3,4,5)       
res18: scala.collection.immutable.Set[Int] = Set(4,5,1,3)
scala> Set(1,5).toList
res25: List[Int] = List(5,4)

这个例子本身就是对我的问题提出了一个“不”的答案。那么ListSet呢?

scala> import scala.collection.immutable.ListSet
scala> ListSet(1,5)
res21: scala.collection.immutable.ListSet[Int] = Set(1,5)

这个似乎是有效的,但我应该依靠这个行为吗?
什么其他数据结构适用于不可变的独特物品收集,原始订单必须保留?

顺便说一下,我知道List中的distict方法。问题是,我想在界面级别强制执行项目的唯一性(同时保留顺序),所以使用distinct会弄乱我的整洁设计。

编辑

ListSet看起来不是很可靠:

scala> ListSet(1,5).toList
res28: List[Int] = List(5,1)

EDIT2

在我寻找一个完美的设计我试过这个:

scala> class MyList[A](list: List[A]) { val values = list.distinct }
scala> implicit def toMyList[A](l: List[A]) = new MyList(l)
scala> implicit def fromMyList[A](l: MyList[A]) = l.values

哪个实际工作:

scala> val l1: MyList[Int] = List(1,3)
scala> l1.values
res0: List[Int] = List(1,3)

scala> val l2: List[Int] = new MyList(List(1,3))
l2: List[Int] = List(1,3)

但是,问题是我不想将MyList暴露在库外。有什么办法可以隐含的转换超越吗?例如:

trait T { def l: MyList[_] }
object O extends T { val l: MyList[_] = List(1,3) }
scala> O.l mkString(" ")  // Let's test the implicit conversion
res7: String = 1 2 3

我想这样做:

object O extends T { val l = List(1,3) }  // Doesn't work

解决方法

我相信你不应该依靠一套的订单。没有语言

除此之外,看看this question这个深入的讨论。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读