在条件下需要在案例类变量中添加元组

dev*_*evD -2 scala case-class

我有一个案例课

case class Attendance(List(name,totalDay))
Run Code Online (Sandbox Code Playgroud)

我有三个变量

val ana = 0
val mario = 33
val romero = 11
Run Code Online (Sandbox Code Playgroud)

我必须创建出勤类的对象,例如只有当出勤率大于零(如上)时,他们才具有姓名和出勤率

Attendance((Mario,33),(Romero,12))
Run Code Online (Sandbox Code Playgroud)

Mar*_*pel 6

就变量和类的命名而言,您的代码不仅与Scala中被认为是最佳实践的地方相距甚远,而且还存在一些不一致之处:

首先,显示代码片段:

// --- WRONG --- //
val Ana = 0
val Mario = 33
val Romero = 11
Run Code Online (Sandbox Code Playgroud)

然后显示代码片段

// --- WRONG --- //
Attendance((Mario,33),(Romero,12))
Run Code Online (Sandbox Code Playgroud)

问题在于,在这种情况下,(Mario, 33)仅表示(33, 33),因为Mario是您分配给的变量33。相反,您应该做的是:

val ana = ("Ana", 0)
val mario = ("Mario", 33)
val romero = ("Romero", 11)
Run Code Online (Sandbox Code Playgroud)

另一个不一致之处是

// --- WRONG --- //
case class attendance(List(name,totalDay))
Run Code Online (Sandbox Code Playgroud)

这不会编译。写当List(name, totalDay)你定义一个List包含两个元素,nametotalDay。这些元素在您的示例中未定义。

您要执行的操作是:

case class Attendance(attendees: List[(String, Int)])
Run Code Online (Sandbox Code Playgroud)

什么attendees: List[(String, Int)]意思

这意味着您要为case类定义一个参数Attendance,该参数称为attendees,并且类型为List[(String, Int)](说:“ 元组列表,每个元组都由字符串和整数组成 ”)

然后,您可以使用它:

val listOfAttendees: List[(String, Int)] = ??? // Not implemented yet
val attendance = Attendance(listOfAttendees)
Run Code Online (Sandbox Code Playgroud)

但是你是怎么做的listOfAttendees呢?

答案是filter

val allAttendees = List(ana, mario, romero)
val filteredAttendees = allAttendees.filter {
   case (name, days) => days > 0
}
Run Code Online (Sandbox Code Playgroud)

放在一起:

val ana = ("Ana", 0)
val mario = ("Mario", 33)
val romero = ("Romero", 11)

case class Attendance(attendees: List[(String, Int)])

val allAttendees = List(ana, mario, romero)

val filteredAttendees = allAttendees.filter {
   case (name, days) => days > 0
}

val attendance = Attendance(filteredAttendees)
Run Code Online (Sandbox Code Playgroud)

试试看!


我希望这有帮助。