我创建了一个Path
类,occupation
和last
可以对其进行唯一标识。
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
。
为什么会这样? 我可以更好地存储我的数据吗?
答案 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)
val
和occupation
last
class Path(val occupation: BitSet, val last: Int)
我建议你创建一个案例类
case class Path(occupation: BitSet, last: Int)
它将基于equals
,hashCode
,toString
和apply
方法的字段unapply
和copy
。
我不确定您是否真的需要修改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)