在两个列表中查找共同项 (Scala)
Find common items in two lists (Scala)
一个 Scala 新手问题。
我正在尝试实现一个接收两个列表的函数,找到一个共同的项目,然后进行操作并创建一个新列表
我有案例class
case class weightedFruits(fruits: Set[String], weight: Double)
和两个列表 weightedFruitsList
和 filteredWeightedFruitsList
:
// 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]]
欢迎任何想法。对不起,如果我的问题让你生气...
最后一个问题,也许有更有效的方法来完成这项任务?
谢谢
type mismatch; found : weightedFruits required: Option[List[weightedFruits]]
是由于您的 conf
方法没有 return 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
覆盖某些字段
一个 Scala 新手问题。
我正在尝试实现一个接收两个列表的函数,找到一个共同的项目,然后进行操作并创建一个新列表
我有案例class
case class weightedFruits(fruits: Set[String], weight: Double)
和两个列表 weightedFruitsList
和 filteredWeightedFruitsList
:
// 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]]
欢迎任何想法。对不起,如果我的问题让你生气...
最后一个问题,也许有更有效的方法来完成这项任务?
谢谢
type mismatch; found : weightedFruits required: Option[List[weightedFruits]]
是由于您的 conf
方法没有 return 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