运动中有特质,应该实施
trait AbstractSet {
def add(n: Int): AbstractSet
def remove(n: Int): AbstractSet
}
这样的任务 编写一个具体的类MutableSet,它扩展了AbstractSet特性并实现了 特质需要的三种方法。顾名思义,你的班级应该是可变的。那 是,在MutableSet上调用add或remove方法应该修改set的实例 调用该方法,使其现在包含(或不再包含)指定的方法 诠释。 请注意,AbstractSet特征指定add和remove方法必须返回 AbstractSet。在MutableSet的情况下,返回当前集合(this)就足够了。这个 已经在入门代码中为您实现。 (请记住,使用return关键字是 可选的;任何代码块都会自动返回其最后一个表达式。)
我写了这样的代码:
class Set1(ab:List[Int]) extends AbstractSet{
var a:List[Int]
this.a=ab
**def add(n:Int){
a.
}**
}
object Main{
def main(args: Array[Int]): Unit = {
var arr2:List[Int]=List(1,2,4,3)
val s: AbstractSet = new Set1(arr2)
s.add(5)
println(s)
// s.print
}
}
但如何在类Set1中实现方法添加?
答案 0 :(得分:0)
在Scala中,List类是不可变的(参见Scala API Documentation);这意味着每当我们更改List的状态时,我们都希望返回一个反映该更改的新List,而不是更改当前List的状态。
另请注意,如果未明确定义return
子句,则Scala中的函数将返回功能块最后一行的值。
转到List文档的链接,然后使用::
运算符查看示例。 ::
是List(以及许多其他)类的前置运算符。由于列表是单链接的,因此将项目添加到列表的前面而不是结束时效率要高得多。
所以在你的Set1
课程中,你可以在你的列表中添加一个Int并简单地返回它:
override def add(n: Int): AbstractSet = new Set1(n :: a)
但是,处理结果列表的方式存在一个小的设计缺陷。正如您在AbstractSet
定义中所看到的,add
方法返回List
。如前所述,列表是不可变的,不会改变。添加后,您需要对返回的List执行某些操作,如下所示:
object Main{
def main(args: Array[Int]): Unit = {
var arr2:List[Int]=List(1,2,4,3)
val s: AbstractSet = new Set1(arr2)
val t = s.add(5)
println(t)
}
}