Найти общие предметы в двух списках (Scala)

Вопрос новичка Скала.

Я пытаюсь реализовать функцию, которая получает два списка, найти общий элемент, затем сделать манипуляции и создать новый список

У меня кейс-класс

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]]

Любые мысли приветствуются. Извините, если мой вопрос рассердит вас...

Последний вопрос, может быть, есть более эффективный способ сделать эту задачу?

Спасибо

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

Другие вопросы по тегам