Scala列表在列表中附加一个类并检索项目

时间:2015-02-17 14:31:43

标签: list scala

新scala所以缺少列表基本。

我试图列出以下类

  case class Person (val name: String, val age:Int, val email: String)

如何创建Person类的列表不可变列表?

我试过了: -

val list: List[Person] = List(Person("",0,"")) // compilation ok
list.::(person) // compile ok

但是当我检查大小时它是1.它应该是2.我也不会在列表中看到添加的人。

请告诉我如何制作人员类列表,插入新人,然后检索人员,无论是年龄,姓名,电子邮件还是索引。

请不要将我推荐给api doc http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List

很难理解:(

4 个答案:

答案 0 :(得分:4)

试试这个。

   val list2 = list.::(person)

记住list是不可变的。 list2的大小应为2.

答案 1 :(得分:2)

记住上述不可变列表,

case class Person (val name: String = "", 
                   val age:Int = 0, 
                   val email: String = "")

(请注意,您可以为每个字段设置构造默认值)和

val list: List[Person] = List(Person("",0,"")) // compilation ok

我们也可以使用List[Person]连接运算符List构建第二个++,如下所示,

val list2 = list ++ List(Person(age=1)) 
list2: List(Person(,0,), Person(,1,))

要按照给定的标准审核Person,例如在此示例中,age,请按以下方式考虑collect

val list3 = list2.collect { case p@Person(_, age, _) if age == 1 => p }
List[Person] = List(Person(,1,))

在这里,我们提取感兴趣的字段age,并检查条件(是否等于1),因此我们选择保持条件的list2中的条目;为了传递这样的条目,我们在每个p实例上使用绑定Person;也许更多的规范(和不必要的重复)方法

val list3 = list2.collect { 
  case Person(name, age, email) if age == 1 => Person(name, age, email) }

类似的方法依赖于filter,如下所示,

list2.filter(p => p.age == 1)

有了理解,就像这样

for ( p@Person(n, a, e) <- list2  if a == 1 ) yield p

在条目列表上定义选择的更详细的方法包括定义一个方法,该方法将谓词作为参数并针对每个条目对其进行评估;另外,为了便于使用,这可以封装在一个隐式类中;因此,请考虑这个例子,

implicit class PersonsOps( val persons: List[Person] ) extends AnyVal {
  def select(pred: Person => Boolean) = persons.filter(pred)
}

因此我们可以在byAge的调用中定义一个匿名函数,即(x: Person) => x.age == 1;因此

list2.select( (x: Person) => x.age == 1 )

或等效

list2.select( _.age == 1 )

请注意,此说明性示例中selectfilter是等效的或可互换的,但select可以通过其他要求进行丰富/扩展。

答案 2 :(得分:1)

正如Soumya Simanta所说,您有一个不可变列表,因此您必须将List运算符返回的::分配给新的val。顺便说一句,您可以使用以下符号

val list2 = person :: list

相当于

val list2 = list.::(person)

要获取Person个实例的信息,您可以使用以下行:

list2 foreach { p: Person => println(p.email) }

foreachList的一种方法。它将一个函数(例如{ p: Person => println(p.email) })应用于列表的所有元素。

答案 3 :(得分:0)

list.::(person)

检索包含两个元素的新列表:旧元素和新元素。但是,该操作不会更改名为list的列表。试试这个:

var list: List[Person] = List(Person("",0,"")) // compilation ok
list = list.::(person) // compile ok