【问题标题】:Sort one Seq according to other Seq's value in Scala根据Scala中其他Seq的值对一个Seq进行排序
【发布时间】:2020-07-31 17:11:06
【问题描述】:

如何根据另一个 Seq 中存在的值的顺序对 Scala Seq 进行排序?

val original_seq = Seq("a", "b", "c", "d", "e", "f", "g")  //[a,b,c,d,e,f,g]
val original_set = original_seq.toSet
val entity_set = Seq("a", "b", "d", "f").toSet  //[a,b,d,f]
val delta_set = original_set.diff(entity_set)
val final_cols = entity_set ++ delta_set.toSeq  //[e f a b g c d] or some random order
//Expected order of final_cols Seq is ==> [a,b,c,d,e,f,g]

final_cols Seq 我想作为original_seq 中的值排序?在 Scala 中如何做到这一点?

【问题讨论】:

  • 套装没有顺序,因此您不能订购它们。为什么订单对您很重要?
  • final_cols.toSeq.sortBy(original_seq.indexOf) 效率低下,如果original_seq 有任何不连续的重复条目将无法工作。
  • 看起来你实际上是在做这两组的联合?

标签: scala seq


【解决方案1】:

你可以这样做(无效的条目会走到最后):

val originalSeq = Seq("a", "b", "c", "d", "e", "f", "g") 
val positionMap = originalSeq.zipWithIndex.toMap

val input = Seq("d", "f", "a", "g", "c")

input.sortBy(x => positionMap.getOrElse(x, positionMap.size))

【讨论】:

    【解决方案2】:

    使用LinkedHashSet (source code)。这是一个按照添加顺序保留项目顺序的集合,通过忽略/删除已经出现的项目来有效地重复您的序列。

    import scala.collection.mutable.LinkedHashSet
    val original:LinkedHashSet[String] = LinkedHashSet() ++ originalSeq
    val entity:Set[String] = Set("a", "b", "d", "f")
    
    // diff will be Set(c, e, g)
    val diff:LinkedHashSet[String] = original &~ entity
    
    // finalItems will be LinkedHashSet[String] = Set(a, b, d, c, f, e, g)
    val finalItems:LinkedHashSet[String] = original & (diff ++ entity)
    // Note above, the entity ++ diff yields the same result as long as
    // original comes first
    

    但是,我不确定您为什么要将集合和集合的某个子集的差异添加回该子集。你总是会得到原来的设置。换句话说,B ⊆ A => B ∪ (A ∖ B) = A

    也许您想要的是这个(只是要订购的子集entity)?

    // result is: LinkedHashSet[String] = Set(a, b, d, f)
    original & entity
    

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      相关资源
      最近更新 更多