从Scala列表中提取元素列表的方法

时间:2014-11-11 07:04:54

标签: scala search scala-collections

我有标准的对象列表,用于某些分析。分析生成一个字符串列表,我需要查看标准的对象列表并检索具有相同名称的对象。

  case class TestObj(name:String,positions:List[Int],present:Boolean)
  val stdLis:List[TestObj]

  //analysis generates a list of strings
  var generatedLis:List[String]

  //list to save objects found in standard list
  val lisBuf = new ListBuffer[TestObj]()

  //my current way
  generatedLis.foreach{i=>
    val temp = stdLis.filter(p=>p.name.equalsIgnoreCase(i))
    if(temp.size==1){
      lisBuf.append(temp(0))
    }
  }

还有其他方法可以实现这一目标。就像有一个自定义的indexof方法,可以覆盖并查找名称而不是整个对象或其他内容。我没有尝试过这种方法,因为我不确定。

2 个答案:

答案 0 :(得分:3)

stdLis.filter(testObj => generatedLis.exists(_.equalsIgnoreCase(testObj.name)))
  • 使用filter过滤来自' stdLis'的元素每个谓词
  • 使用exists检查“生成的”是否'有......的价值。

答案 1 :(得分:1)

不要使用可变容器来过滤序列。

天真的解决方案:

val lisBuf =
  for {
    str <- generatedLis
    temp = stdLis.filter(_.name.equalsIgnoreCase(str))
    if temp.size == 1
  } yield temp(0)

如果我们放弃条件temp.size == 1(我不确定它是否合法):

val lisBuf = stdLis.filter(s => generatedLis.exists(_.equalsIgnoreCase(s.name)))