按字段排序

时间:2016-01-24 19:48:31

标签: scala

我创建了一个Path类,occupationlast可以对其进行唯一标识。

case class Path(occupation: BitSet, last: Int) {
      var cost = 0
      def setCost(cost: Int) {
          this.cost = cost
      }

      def getCost(): Int = {
          return cost
      }
  }
}

另外,我希望count可以对它进行排序,我创建了一个字段。

implicit val pathOrd = Ordering.by((p: Path) => p.getCost)

问题在于,当我对它进行排序时(正如您在上面的行中所看到的那样),我在该行上得到java.lang.NullPointerException

为什么会这样? 我可以更好地存储我的数据吗?

2 个答案:

答案 0 :(得分:1)

您的代码使用此代码对我没有任何例外:

@ class Path(occupation: BitSet, last: Int) {
        var cost = 0
        def setCost(cost: Int) {
            this.cost = cost
        }

        def getCost(): Int = {
            return cost
        }
    }
defined class Path
@ List(new Path(BitSet(), 3))
res6: List[Path] = List(cmd5$Path@3ef8de39)
@ implicit val pathOrd = Ordering.by((p: Path) => p.getCost)
pathOrd: Ordering[Path] = scala.math.Ordering$$anon$9@5f478e42
@ res6.sorted
res9: List[Path] = List(cmd5$Path@3ef8de39)

valoccupation

缺少last
class Path(val occupation: BitSet, val last: Int)

我建议你创建一个案例类

case class Path(occupation: BitSet, last: Int)

它将基于equalshashCodetoStringapply方法的字段unapplycopy

我不确定您是否真的需要修改cost,如果它是根据其他值计算的,那么您可以将其作为方法

case class Path(occupation: BitSet, last: Int) {
  def cost: Int = 42
}

如果不是那么它应该是一个字段。我想鼓励你使用不可变结构,这意味着要做:

case class Path(occupation: BitSet, last: Int, cost: Int)

在scala中添加带有setter和getter的字段就像这样简单:

class Path(val occupation: BitSet, val last: Int) {
  var cost = 0
}

你可以像这样使用它:

val path = new Path(BitSet(), 3)
path.cost = 12
println(path.cost)

答案 1 :(得分:1)

这是一个更简单的代码版本,它使用Scala的转换来使用var来表示类中的可变状态:

case class Path
(occupation: BitSet, // Immutable (will never change) 
var cost: Int = 0, // Mutable 
var last: Int = 0 // Mutable
)

// Implementing the Ordering TypeClass
implicit val pathOrd = Ordering.by((p: Path) => p.cost)

val t = new Path(BitSet(1,2), 0, 0)

t.cost = 2 // changing cost
val data = Seq(new Path(BitSet(1,2), 0, 0), new Path(BitSet(1), 3, 0), new Path(BitSet(1), 2, 0))

println(data.sorted)