我在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]]
答案 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)
Array
(没有特别的原因)。 Iterable
。