【问题标题】:Find common items in two lists (Scala)在两个列表中查找共同项目 (Scala)
【发布时间】:2017-01-31 07:08:58
【问题描述】:

一个新手 Scala 问题。

我正在尝试实现一个接收两个列表的函数,找到一个共同的项目,而不是进行操作并创建一个新列表

我有一个案例类

case class weightedFruits(fruits: Set[String], weight: Double) 

还有两个列表weightedFruitsListfilteredWeightedFruitsList

// set is sorted 
val weightedFruitsList = List(
weightedFruits(Set("banana"), 200),
weightedFruits(Set("banana", "orange"), 180),
weightedFruits(Set("banana", "orange", "apple"), 170),
weightedFruits(Set("feijoa", "fig"), 201))


 //filtered List , Set sorted, contains "melon" as last member
val filteredWeightedFruitsList = List(
weightedFruits(Set("banana", "melon"), 250),
weightedFruits(Set("banana", "orange", "melon"), 270),
weightedFruits(Set("banana", "orange", "apple", "melon"), 365))

我想检查 filteredWeightedFruitsList 中的每个项目,在 weightedFruitsList 中找到相同的项目,做一个小操作并创建一个新的 List[weightedFruits]

我的(还没有工作)代码:

def conf :Option[List[weightedFruits]] = {

  for (filtered <- filteredWeightedFruitsList){

     weightedFruitsList.find{

      case x if ( x.fruits equals filtered.fruits.dropRight(1) ) => return weightedFruits(x.fruits, x.weight / filtered.weight)]
      case _ => false
   }    
  }    
}

使用这段代码我有两个问题: 1)type mismatch; found : Unit required: Option

2)type mismatch; found : weightedFruits required: Option[List[weightedFruits]]

欢迎任何想法。对不起,如果我的问题让你生气了...

最后一个问题也许有更有效的方法来完成这项任务?

谢谢

【问题讨论】:

  • 也许值得注意的是,集合没有排序。为此,您需要SortedSets
  • 您能否举一个所需函数的签名、输入和输出的示例?示例def add1(x: Int): Int,输入:add1(42),输出:43
  • 想要的函数输入两个List[weightedFuits],输出也是列表。 def conf ( filtered: List[weightedFruits] , full: List[weightedFruits]): List[weightedFruits]

标签: scala scala-collections


【解决方案1】:

type mismatch; found : weightedFruits required: Option[List[weightedFruits]] 是由于你的conf 方法没有返回Option[List[weightedFruits]] 类型的结果。也许你可以尝试使用for yield 来做到这一点。

def conf :List[weightedFruits] = for {
   f <- filteredWeightedFruitsList
   t <- weightedFruitsList.find(i => f.fruits.dropRight(1) == i.fruits)
} yield t.copy(weight = t.weight / f.weight)

copy 方法将复制case class,并使用name 覆盖一些字段

【讨论】:

  • 看起来不错,请添加一些关于t.copy的文字
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多