繁体   English   中英

Scala 排序列表[(String, Double)]

[英]Scala Sort List[(String, Double)]

我正在尝试在 Scala 中首先通过 Double 和 String 对 List[(String, Double)] 进行排序。 这意味着我希望 List by 首先按 Double 的大小排序,然后按字母顺序排序。

例如,

val sortThisList = List[("C", 2.0), ("B", 1.0), ("A", 1.0), ("B", 2.0), ("A", 2.0), ("C", 1.0)]

sortThisList 排序后应如下所示:

List[("A", 2.0), ("B", 2.0), ("C", 2.0), ("A", 1.0), ("B", 1.0), ("C", 1.0)]

我曾尝试使用 sortBy 函数:

val sortedList = sortThisList.sortBy(_._2).sortBy(_._1)

这是我尝试使用 sortBy 和 sortWith 进行编译的唯一版本。 但是,它只会生成按字母顺序排序的 sortedList 版本,而不是按 Double 的大小然后按字母顺序排序。

您的代码几乎是正确的,但您需要以相反的顺序排序并否定双倍以从高到低排序:

sortThisList.sortBy(_._1).sortBy(-_._2)

这是有效的,因为 Scala 排序是稳定的,这意味着如果排序值相同,则值保持相同的顺序。 所以第一个sortBy确保字符串有序,第二个sortBy按双sortBy排序(相反)。 如果有多个记录具有相同的双精度值,它们仍按字符串值排序。

但是,这可以使用sortBy在单个操作中sortBy

sortThisList.sortBy(e => (-e._2, e._1))

这是通过按优先级顺序提取字段并按该值排序来实现的。

您的问题是由拼写错误引起的:

 val sortThisList = List[("C", 2.0), ("B", 1.0), ("A", 1.0), ("B", 2.0), ("A", 2.0), ("C", 1.0)]

这行不通。 您正在做的是传递六个类型参数,它们是文字类型对。 您可能想要传递值参数 在 Scala 中,就像在几乎所有编程语言中一样(是的,我知道,有 Rebol),值参数在圆括号中传递,而不是在方括号中。

弄清楚了。

val listByValue = sortThisList.groupBy { case (key, value) => value }.toSeq
val listByValue = listByValue.sortBy { case (value, group) => value }
val sortedList = listByValue.flatMap { case (key, value) => value.sortBy { case (key, value) => value } }.reverse.toList

列表<object>双重排序<div id="text_translate"><p>我有一个像这样的 model。</p><pre> public class MenuItem { public string Description { get; set; } public string MenuTypeID { get; set; } public int DailyMax { get; set; } }</pre><p> 然后我有这样的方法。</p><pre> public List&lt;MenuItem&gt; GetMenuItem() { List&lt;MenuItem&gt; menuItems = new List&lt;MenuItem&gt;(); DataSet ds = null; .... left out ds populating code.... try { foreach (DataRow dr in ds.Tables[0].Rows) { MenuItem menuItem = new MenuItemType(); menuItem.Description = dr["Description"].ToString(); menuItem.MenuTypeID = dr["MenuTypeID"].ToString(); menuItems.Add(menuItem); } List&lt;MenuItemType&gt; SortedList = menuItems.Sort((x, y) =&gt; x.MenuTypeID.CompareTo(y.MenuTypeID)); // compile error: Cannot implicitly convert type 'void' to 'System.Collections.Generic.List&lt;MenuItem&gt;' } catch (Exception ex) { } finally { } return SortedList; }</pre><p> 我的问题是,</p><ol><li> 如何排序没有编译错误?</li><li> 是否可以menuTypeId排序,然后按description排序?</li></ol></div></object>

[英]List<object> double sort

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何对 scala 中的 map 进行排序,其中键为 List[Double],值为 double。 我想用双重排序? 排序 List(Double, (String, List[String])) 首先按 Double 然后按元组中的第一个 String 值 Scala将映射[String,List [Int,Double]]映射到[Int,List [String,Double]] Scala 如何在以下列表中与 Map[String, Double] 类型的地图相交:List[Map[String, Double]] 列表<object>双重排序<div id="text_translate"><p>我有一个像这样的 model。</p><pre> public class MenuItem { public string Description { get; set; } public string MenuTypeID { get; set; } public int DailyMax { get; set; } }</pre><p> 然后我有这样的方法。</p><pre> public List&lt;MenuItem&gt; GetMenuItem() { List&lt;MenuItem&gt; menuItems = new List&lt;MenuItem&gt;(); DataSet ds = null; .... left out ds populating code.... try { foreach (DataRow dr in ds.Tables[0].Rows) { MenuItem menuItem = new MenuItemType(); menuItem.Description = dr["Description"].ToString(); menuItem.MenuTypeID = dr["MenuTypeID"].ToString(); menuItems.Add(menuItem); } List&lt;MenuItemType&gt; SortedList = menuItems.Sort((x, y) =&gt; x.MenuTypeID.CompareTo(y.MenuTypeID)); // compile error: Cannot implicitly convert type 'void' to 'System.Collections.Generic.List&lt;MenuItem&gt;' } catch (Exception ex) { } finally { } return SortedList; }</pre><p> 我的问题是,</p><ol><li> 如何排序没有编译错误?</li><li> 是否可以menuTypeId排序,然后按description排序?</li></ol></div></object> 如何根据存储的双倍分数对字符串列表进行排序? 在Scala中生成双精度/十进制列表 Scala中的List [List [String]] Scala按属性对元组排序列表 Scala基于字符串中的数字排序
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM