Scala:我可以依赖集合中项目的顺序吗?

2024-02-26

这是一个相当不愉快的意外:

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

这个例子本身对我的问题给出了“否”的答案。那么呢ListSet?

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

这似乎有效,但我应该依赖这种行为吗? 还有什么其他数据结构适合于必须保留原始顺序的唯一项的不可变集合?

顺便说一句,我确实知道distict中的方法List。问题是,我想在接口级别强制项目的唯一性(同时保留顺序),因此使用distinct会弄乱我整洁的设计..

EDIT

ListSet似乎也不是很可靠:

scala> ListSet(1, 2, 3, 4, 5).toList
res28: List[Int] = List(5, 4, 3, 2, 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, 2, 3)
scala> l1.values
res0: List[Int] = List(1, 2, 3)

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

但问题是我不想暴露MyList图书馆外。有什么办法可以在覆盖时进行隐式转换吗?例如:

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

我想这样做:

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

这取决于您使用的套件。如果您不知道您拥有哪个 Set 实现,那么答案很简单,不,您无法确定。在实际工作中我通常会遇到以下三种情况:

  1. 我需要订购套装中的商品。为此,我使用混合类SortedSet当您仅使用标准 Scala API 时,该特征始终是TreeSet。它保证元素按照它们的顺序排序compareTo方法(参见Ordered达叻府)。由于插入/检索的运行时间现在是对数的,而不是像HashSet(假设有一个好的哈希函数)。

  2. 您需要保留插入项目的顺序。然后你使用LinkedHashSet。几乎和正常一样快HashSet,需要更多的存储空间来存储元素之间的附加链接。

  3. 你不关心集合中的顺序。所以你使用一个HashSet。 (这是使用时的默认设置Set.apply方法如第一个示例中所示)

所有这些也适用于 Java,Java 有一个TreeSet, LinkedHashSet and HashSet以及对应的接口SortedSet, Comparable和朴素的Set.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:我可以依赖集合中项目的顺序吗? 的相关文章

随机推荐

  • 将 Access 2010 转换为旧版本

    我希望能够使用脚本将 Access 2010 数据库转换为多个不同的旧版本 因此 如果我将 2010 Access 提供给脚本 我希望它输出以下版本之一 2000 2002 2003 或 2007 这怎么可能 我不是在寻找完整的脚本 而是在
  • gvim:轻松复制到系统剪贴板

    我在 Ubuntu 10 10 上使用 gVim 我想将文本复制 猛拉 到系统剪贴板 以便复制的文本可在其他应用程序中使用 这适用于 y 但我想让它与y 我尝试过绘制地图y to y但是之后yy不再工作 因为它产生 y y 我也尝试过 se
  • 可选类型注释。检查是否为 None 后使用值?

    我正在用 python 编写一些带有类型注释的代码 我对可选类型有疑问 例如对于这样的代码 maybe number Optional int definition if maybe number None else I know its
  • 如何重写 Java 中的类方法并向其添加“抛出”声明?

    Android 中是否有可能有一个 抛出 东西的 AsyncTask 如果我不 Override 该方法 则不会调用它 如果我在末尾添加 抛出 则会出现编译器错误 例如 我想做类似的事情 class testThrows extends A
  • 下载 SQL SERVER 代理 - Microsoft SQL Server

    我已下载 SQL SERVER MANAGEMENT STUDIO 但未找到 SQL SERVER AGENT 我应该单独安装吗 谁能告诉我免费软件 SQL SERVER AGENT 的下载链接吗 如果使用 SQL Server Manag
  • 在 C# 中以编程方式创建 Azure AD

    是否可以在 Azure 订阅中以编程方式创建 Azure Active Directory 我查看了 Azure 管理 API 可以看到创建 VM 数据库的方法 但没有看到 WAAD 的方法 如果可能 每个订阅可以创建多少个 WAAD 不可
  • ISerialized 是否向后兼容具有较少字段的类的早期版本?

    抱歉 如果我的问题措辞有点奇怪 基本上 我有一个可序列化的类 目前只有一个字段 但随着我们向系统添加功能 将来肯定会获得更多 序列化过程将用于将实例传递到 WCF 服务 以及从文件读取实例或将实例写入文件 当然 如果我不断用额外的字段更新类
  • 优化 C++ 模板执行

    我正在从事性能至关重要的项目 该应用程序正在处理大量数据 代码是用C 编写的 我需要做一些更改 给出了以下代码 这不是我的代码 我将其简化为最小 void process
  • HAML如何识别块的结尾?

    form for subject url gt action gt create do f render partial gt form locals gt f gt f form buttons submit tag Create Sub
  • Neo4j 使用属性过滤器通过多个关系定向路径

    作为 Cypher 和 Neo4j 的新手 我在为我的用例构建查询时遇到问题 我正在构建一个简单的 ACL 访问控制列表 并正在寻找一条通过权限关系向上层次结构的路径 一张图或许能更好地解释它 Key Users gt Blue Group
  • C# 源生成器应该刷新/删除发出的文件

    我创建了一个源生成器来扩展满足某些条件的 部分 类 为了检查和查看生成的代码 我通过将以下内容添加到我的项目中来启用这些文件的发射
  • 如何使用 Spring Data ElasticSearch 为 POJO 定义 ElasticSearch 索引字段名称

    我正在使用 Spring Data ElasticSearch 来执行 CRUD 操作 默认情况下 当使用 Document 注释的 POJO 写入 ElasticSearch 索引时 索引字段名称与 POJO 的 Java 属性名称相同
  • WPF:如何冻结数据网格中的列标题

    如何将我的列标题冻结在DataGrid in my WPF窗口 以便当我向下滚动时 标题仍然可见 Edit 这是我的XAML
  • Scrapy 将子站点项目与站点项目合并

    我试图从子网站中抓取详细信息并与网站中抓取的详细信息合并 我一直在通过 stackoverflow 以及文档进行研究 但是 我仍然无法让我的代码工作 看来我从子网站提取附加详细信息的功能不起作用 如果有人能看一下我将非常感激 coding
  • 测试元素的类型 python tuple/list

    如何验证列表或元组中所有元素的类型是否相同并且属于某种类型 例如 1 2 3 test for all int True 1 3 a test for all int False all isinstance n int for n in
  • 日期输入的 onchange [重复]

    这个问题在这里已经有答案了 可能的重复 当 的值发生更改时 会触发哪些事件 https stackoverflow com questions 3940258 what events does an input type number fi
  • 从 grails 项目执行甘特脚本

    我已经编写了自己的甘特脚本 它可以在命令行中正常工作 现在我需要从 grails 项目运行这个脚本 如下所示 def outputMessage try GroovyScriptEngine engine new GroovyScriptE
  • 如何使用 TFS REST API 获取迭代剩余天数

    我目前正在使用REST API version 2 0并连接到我的 TFS 实例PowerShell 我可以得到以下信息 迭代ID迭代名称队员团队成员每天的容量 使用下面的示例 GET https instance DefaultColle
  • 在 C# 中扩展枚举

    在java中 我习惯于扩展枚举值或重写方法 如下所示 enum SomeEnum option1 sv public String toString return Some value option2 private String Pass
  • Scala:我可以依赖集合中项目的顺序吗?

    这是一个相当不愉快的意外 scala gt Set 1 2 3 4 5 res18 scala collection immutable Set Int Set 4 5 1 2 3 scala gt Set 1 2 3 4 5 toList