list - Scala根据另一个列表中的值对一个列表进行排序

标签 list scala

我有两个IndexedSeq

works[Work]
order[Int]

每个对象Work都有一个带有整数值的id字段:Work.id
在订单列表中有ID,这些ID符合我们整理工作的顺序。就像,在位置0有第一个ID,因此我们需要在Works数组中找到具有与该ID对应的ID的作品,并将其放在0处,依此类推。
有没有办法通过scala做到这一点而无需经历两个循环?
一些伪数据,例如:
order = 33, 22, 11, 55

works = (33, "some text"), (55, "eeeee"), (22, "fdsfs"), (11, "fdsffds")

排序后:
order = 33, 22, 11, 55

works = (33, "some text"),(22, "fdsfs"),  (11, "fdsffds"), (55, "eeeee"),

最佳答案

您可以为此使用字典,其复杂度为O(N)(与两个嵌套循环的N * N相比,它更好):

scala> val order = List(33, 22, 11, 55)
order: List[Int] = List(33, 22, 11, 55)

scala> val works = List((33, "some text"), (55, "eeeee"), (22, "fdsfs"), (11, "fdsffds"))
works: List[(Int, String)] = List((33,some text), (55,eeeee), (22,fdsfs), (11,fdsffds))

scala> val worksMap = works.toMap
worksMap: scala.collection.immutable.Map[Int,String] = Map(33 -> some text, 55 -> eeeee, 22 -> fdsfs, 11 -> fdsffds)

scala> val newWorks = order zip order.map(worksMap)
newWorks: List[(Int, String)] = List((33,some text), (22,fdsfs), (11,fdsffds), (55,eeeee))

如果您的实体不仅仅是元组:
scala> val worksMap = (works map (_._1) zip works).toMap //any other key extraction, like `_.myKey` may be applied instead of `_._1`
worksMap: scala.collection.immutable.Map[Int,(Int, String)] = Map(33 -> (33,some text), 55 -> (55,eeeee), 22 -> (22,fdsfs), 11 -> (11,fdsffds))

scala> order.map(worksMap)
res13: List[(Int, String)] = List((33,some text), (22,fdsfs), (11,fdsffds), (55,eeeee))

如果您不想为Map花费内存-只需使用find而不是Map.apply(但它会是O(N * N),因此速度较慢):
scala> val newWorks = order.map(x => works.find(_._1 == x).get)
newWorks: List[(Int, String)] = List((33,some text), (22,fdsfs), (11,fdsffds), (55,eeeee))

如果您不想在order不包含 key 的情况下出现异常,则可以使用flatMap:
scala> val newWorks = order.flatMap(x => works.find(_._1 == x))
newWorks: List[(Int, String)] = List((33,some text), (22,fdsfs), (11,fdsffds), (55,eeeee))

scala> order.flatMap(worksMap.get)
res15: List[(Int, String)] = List((33,some text), (22,fdsfs), (11,fdsffds), (55,eeeee))

关于list - Scala根据另一个列表中的值对一个列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29417462/

相关文章:

Scala 封装对象并 Play ! 2

scala - 为 Scala IDE 配置 Scala 调试器

scala - akka HttpResponse将主体读取为String scala

c# - 如何在不使用 Loop 的情况下更改 List<UIControl> 中控件的属性?

java - 获取列表元素

scala - 在intellij中调试scala代码?

scala - SBT - 无法精确 Play 2 应用程序的项目依赖项

python - 为迭代器的每个元素创建一个包含 2 个条目的列表

r - 在 mutate 中访问列表元素

C++ list::按成员对类进行排序