使用ties处理scala数组组
我有一系列的名字。我需要按元素分组并选择计数最高的名称。如果有联系,请按字母顺序返回姓氏。到目前为止,我有以下资料:使用ties处理scala数组组,scala,Scala,我有一系列的名字。我需要按元素分组并选择计数最高的名称。如果有联系,请按字母顺序返回姓氏。到目前为止,我有以下资料: val names = Array("Adam", "Eve", "Adam", "Eve", "John", "Doe") val countNames = names.map(x => (x, names.count(_ == x))).toSeq.sortBy(_._2) 我的成绩应该是夏娃。如何获取该值?您可以使用(Int,String)元组的自然顺序,并获取最后
val names = Array("Adam", "Eve", "Adam", "Eve", "John", "Doe")
val countNames = names.map(x => (x, names.count(_ == x))).toSeq.sortBy(_._2)
我的成绩应该是夏娃。如何获取该值?您可以使用
(Int,String)
元组的自然顺序,并获取最后一个元素:
countNames.sortWith( (x,y) =>
(x._2 > y._2) ||
(x._2 == y._2 && x._1 > y._1) )(0)._2
这将像预期的那样工作,因为这种排序将把最高计数放在最后,在具有相同计数的元组中,将按字母顺序排序,再次将“较高”的字母顺序值放在最后
p、 s.也可以使用groupBy
进行分组:
names.groupBy(identity) // Map(Adam -> Array(Adam, Adam), Doe -> Array(Doe), Eve -> Array(Eve, Eve), John -> Array(John))
.mapValues(_.length) // Map(Adam -> 2, Doe -> 1, Eve -> 2, John -> 1)
.toSeq.map(_.swap) // ArrayBuffer((2,Adam), (1,Doe), (2,Eve), (1,John))
.sorted // ArrayBuffer((1,Doe), (1,John), (2,Adam), (2,Eve))
.last._2 // Eve
您可以使用
(Int,String)
元组的自然顺序,并获取最后一个元素:
countNames.sortWith( (x,y) =>
(x._2 > y._2) ||
(x._2 == y._2 && x._1 > y._1) )(0)._2
这将像预期的那样工作,因为这种排序将把最高计数放在最后,在具有相同计数的元组中,将按字母顺序排序,再次将“较高”的字母顺序值放在最后
p、 s.也可以使用groupBy
进行分组:
names.groupBy(identity) // Map(Adam -> Array(Adam, Adam), Doe -> Array(Doe), Eve -> Array(Eve, Eve), John -> Array(John))
.mapValues(_.length) // Map(Adam -> 2, Doe -> 1, Eve -> 2, John -> 1)
.toSeq.map(_.swap) // ArrayBuffer((2,Adam), (1,Doe), (2,Eve), (1,John))
.sorted // ArrayBuffer((1,Doe), (1,John), (2,Adam), (2,Eve))
.last._2 // Eve
定义字典顺序,其中计数优先于字符串。然后使用它对列表进行排序并选择第一个元素:
countNames.sortWith( (x,y) =>
(x._2 > y._2) ||
(x._2 == y._2 && x._1 > y._1) )(0)._2
定义字典顺序,其中计数优先于字符串。然后使用它对列表进行排序并选择第一个元素:
countNames.sortWith( (x,y) =>
(x._2 > y._2) ||
(x._2 == y._2 && x._1 > y._1) )(0)._2
我喜欢你的第一种方法。我不知道“排序”对元组的两个元素都排序。请使用
max
而不是sorted。最后一个。我喜欢您的第一种方法。我不知道“排序”对元组的两个元素都排序。请使用max
而不是sorted.last
。