删除和过滤列表元素
在 Scala 中,您可以过滤列表以删除元素。
scala> val courses = List("Artificial Intelligence", "Programming Languages", "Compilers", "Networks", "Databases")
courses: List[java.lang.String] = List(Artificial Intelligence, Programming Languages, Compilers, Networks, Databases)
让我们删除几个类:
courses.filterNot(p => p == "Compilers" || p == "Databases")
您也可以使用 remove,但不推荐使用它以支持 filter 或 filterNot。
如果要按索引删除,可以使用 将列表中的每个元素与有序索引相关联zipWithIndex
。所以,courses.zipWithIndex
变成:
List[(java.lang.String, Int)] = List((Artificial Intelligence,0), (Programming Languages,1), (Compilers,2), (Networks,3), (Databases,4))
要从中删除第二个元素,您可以参考元组中的索引,courses.filterNot(_._2 == 1)
其中给出了列表:
res8: List[(java.lang.String, Int)] = List((Artificial Intelligence,0), (Compilers,2), (Networks,3), (Databases,4))
最后,另一个工具是用来indexWhere
查找任意元素的索引。
courses.indexWhere(_ contains "Languages")
res9: Int = 1
重新更新
我正在编写一个函数来从每个列表中删除相应的元素,我所知道的是 1)索引对应和 2)用户输入课程名称。如何使用 filterNot 从每个列表中删除相应的元素?
与 Nikita 的更新类似,您必须“合并”每个列表的元素。所以需要将课程、经络、天数和时间放入一个元组或类中来保存相关的元素。然后您可以过滤元组的元素或类的字段。
使用此示例数据将相应的元素组合成一个元组如下所示:
val courses = List(Artificial Intelligence, Programming Languages, Compilers, Networks, Databases)
val meridiems = List(am, pm, am, pm, am)
val times = List(100, 1200, 0100, 0900, 0800)
val days = List(MWF, TTH, MW, MWF, MTWTHF)
将它们与 zip 结合起来:
courses zip days zip times zip meridiems
val zipped = List[(((java.lang.String, java.lang.String), java.lang.String), java.lang.String)] = List((((Artificial Intelligence,MWF),100),am), (((Programming Languages,TTH),1200),pm), (((Compilers,MW),0100),am), (((Networks,MWF),0900),pm), (((Databases,MTWTHF),0800),am))
这种憎恶将嵌套的元组扁平化为元组。有更好的方法。
zipped.map(x => (x._1._1._1, x._1._1._2, x._1._2, x._2)).toList
一个很好的元组列表。
List[(java.lang.String, java.lang.String, java.lang.String, java.lang.String)] = List((Artificial Intelligence,MWF,100,am), (Programming Languages,TTH,1200,pm), (Compilers,MW,0100,am), (Networks,MWF,0900,pm), (Databases,MTWTHF,0800,am))
最后,我们可以使用filterNot
. 例如filterNot(_._1 == "Networks")
List[(java.lang.String, java.lang.String, java.lang.String, java.lang.String)] = List((Artificial Intelligence,MWF,100,am), (Programming Languages,TTH,1200,pm), (Compilers,MW,0100,am), (Databases,MTWTHF,0800,am))