Scala:根据另一个列表排序号码列表

时间:2017-04-30 02:20:35

标签: algorithm scala sorting data-structures

我在scala中实现了一个算法,其中我有一组节点(整数),每个节点都有一个与之关联的属性,让我们调用该属性“d”(这也是一个整数)。

我有一个列表[Int],这个列表包含值为“d”的降序的节点。

我也有一个Map [Int,Iterable [Int]],这里的key是一个节点,value是它所有邻居的列表。

问题是,如何按属性“d”的降序存储Map中节点的邻居列表。

示例:

清单1:清单[1,5,7,2,4,8,6,3] - >想象一下,这个列表按某种顺序排序,并且包含所有数字。

地图:[Int,Iterable] [Int]] - > [1,Iterable [2,3,4,5,6]]

此可迭代可能包含也可能没有所有数字。

简单来说,我希望Iterable中的数字与List 1中的数字顺序相同。

所以我在Map中的条目应该是:[1,Iterable [5,2,4,6,3]]

3 个答案:

答案 0 :(得分:2)

最简单的方法是过滤排序列表。

val list = List(1,5,7,2,4,8,6,3)
val map = Map(1 -> List(2,3,4,5,6),
              2 -> List(1,2,7,8))
val map2 = map.mapValues(neighbors => list.filter(neighbors.contains))
println(map2)

答案 1 :(得分:1)

以下是使用foldLeft的可能解决方案(请注意,我们在结尾处获得了ArrayBuffer而不是期望的Iterable,但类型签名确实说Iterable):

scala> val orderTemplate = List(1,5,7,2,4,8,6,3)
orderTemplate: List[Int] = List(1, 5, 7, 2, 4, 8, 6, 3)

scala> val toOrder = Map(1 -> Iterable(2,3,4,5,6))
toOrder: scala.collection.immutable.Map[Int,Iterable[Int]] = Map(1 -> List(2, 3, 4, 5, 6))

scala> val ordered = toOrder.mapValues(iterable =>
  orderTemplate.foldLeft(Iterable.empty[Int])((a, i) =>
    if (iterable.toBuffer.contains(i)) a.toBuffer :+ i
    else a
  )
)
ordered: scala.collection.immutable.Map[Int,Iterable[Int]] = Map(1 -> ArrayBuffer(5, 2, 4, 6, 3))

答案 2 :(得分:1)

这是我得到的。

val lst = List(1,5,7,2,4,8,6,3)
val itr = Iterable(2,3,4,5,6)

itr.map(x => (lst.indexOf(x), x))
   .toArray
   .sorted
   .map(_._2)
   .toIterable       // res0: Iterable[Int] = WrappedArray(5, 2, 4, 6, 3)
  1. 我将每个条目与其完整列表中的相对索引相结合。
  2. 不能对迭代进行排序,所以选择了Array(没有特别的原因)。
  3. 元组排序默认为第一个元素。
  4. 删除索引。
  5. 返回Iterable