Scala对抽象类扩展中具有相同字段的两个不同对象的排序列表

时间:2017-05-02 03:05:10

标签: scala

假设我有:

object test{
abstract class Base 

然后扩展Base的两个案例类alpha和beta,写成:

case class alpha(num: Int, other: String) extends Base
case class beta(num:Int, other_two: String) extends Base

然后说我有一个Base对象列表List[Base]

其中一些对象是alpha版,有些是beta版。我想按字段num(alpha和beta对象之间的公共字段)对它们进行排序。

从我所阅读/谷歌搜索的每个人和他们的祖母建议做以下事情:

val i: List[Base] =  List(alpha(4,"test"),beta(2,"test_two")).sortby(_.num)

然而,这不起作用。工作是什么:

val j: List[Base] =List(alpha(4,"test"),beta(2,"test_two")).sortWith(num(_) < num(_)) 

} 

我的问题是为什么前者不起作用,后者为什么起作用?

3 个答案:

答案 0 :(得分:1)

您可以在基类中声明子类应该具有num值:

abstract class Base {
  val num: Int
}

然后使用您的第二个变体

val i: List[Base] =  List(alpha(4,"test"),beta(2,"test_two")).sortBy(_.num)

答案 1 :(得分:1)

您的第一个示例不起作用,因为<script src="http://code.jquery.com/jquery-1.10.2.js"></script> <script language="javascript"> function singleRbtnSelect(chb) { $(chb).closest("table").find("input:radio").prop("checked", false); $(chb).prop("checked", true); } </script> 没有Base成员。尽管.num的所有元素都可能包含List个成员,但已告知编译器将它们视为.num类型,因此Base无效。

_.num示例仅在方法sortWith()存在时才有效。这样的事情。

num()

现在第二个示例编译并运行,因为def num(x: Base): Int = x match { case a: alpha => a.num // BTW, class names should be capitalized case b: beta => b.num case _ => 0 } 方法正在确定类型并提取num()成员(如果存在)。但如果是这种情况,那么你的第一个例子也可以起作用。

.num

答案 2 :(得分:0)

使用@Harald建议的解决方案,如果提供的函数修改如下,int one, two, three; 方法将起作用:

sortWith