首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于第二个元素的元组排序列表,同时交替使用第三个元素

基于第二个元素的元组排序列表,同时交替使用第三个元素
EN

Stack Overflow用户
提问于 2016-10-21 09:29:02
回答 1查看 352关注 0票数 0

给出了一个元组列表:

代码语言:javascript
复制
val mylist = List(('orange', 0.9, 10), ('apple', 0.8, 10), ('mellon', 0.7, 10), 
                  ('car', 0.5, 2), ('truck', 0.5, 2),('tablet', 0.3, 3))

我想根据元组的第二个元素按降序排序。然而,我想按类别挑选它们,一次一次(第三要素)。输出应该是以下列表:

代码语言:javascript
复制
('orange', 0.9, 10)
('car', 0.5, 2)
('tablet', 0.3, 3)
('apple', 0.8, 10) 
('truck', 0.5, 2)
('mellon', 0.7, 10) 

在Scala中实现它的功能方式是什么?

PS:注意,结果必须反映第三个元素的顺序,即10出现在2之前,2出现在3之前。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-21 10:39:26

可以通过向列表中的每个项添加两个索引来做到这一点:

  • 项目的类别在所有现有类别中的位置(即0表示类别10、1表示2和2表示3)
  • 项的索引通过第二个元组元素的降序值在其类别

一旦添加了这些内容,就可以按两者进行排序(索引以类别为优先)。

代码语言:javascript
复制
// traverse once to get a map of Category -> CategoryIndex
val categoryOrder: Map[Int, Int] = mylist.map(_._3).distinct.zipWithIndex.toMap

val result: List[(String, Double, Int)] = mylist
  .groupBy(_._3).mapValues(_.sortBy(-_._2).zipWithIndex) // add the index of each item within its category
  .toList.flatMap(_._2) // remove group keys and flatMap to get back to tuples
  .sortBy { case (t, indx) => (indx, categoryOrder(t._3)) } // order by index in category and category index
  .map(_._1) // remove indices

println(result)
// List((orange,0.9,10), (car,0.5,2), (tablet,0.3,3), (apple,0.8,10), (truck,0.5,2), (mellon,0.7,10))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40173020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档