Scala Добавлять элементы в набор только проверкой указанных c полей класса case - PullRequest
1 голос
/ 07 мая 2020

У меня есть класс case

case class ApiCall(a: String, b: String, c: String, d: String, e: String, f: String)

У меня также есть изменяемый Set: private var apiCalls: mutable.Set[ApiCall] = mutable.Set[ApiCall]()

Проблема в том, что я могу получить следующие элементы ApiCall:

ApiCall(a1, b1, c1, d1, e1, f1)
ApiCall(a1, b1, c1, d2, e2, f2)

Мне нужно добавить элементы в набор, только если уникальная комбинация (a, b, c) из case class ApiCall еще не существует. Я не могу изменить сам класс case, потому что он используется в нескольких местах.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Возможно, вы захотите использовать Map вместо Set в вашем случае:

val apiCalls = mutable.Map[(String, String, String), ApiCall]()

Также значения заменяются для совпадающих ключей внутри Map, вам может потребоваться отдельный метод для обновления Карта вызовов API:

def updateApiCalls(call: ApiCall): Unit = {
  apiCalls.getOrElseUpdate((call.a, call.b, call.c), call)
  ()
}
0 голосов
/ 08 мая 2020

Я вроде решил это с помощью небольшого обходного пути:

private var _apiCalls: mutable.Set[ApiCall] = mutable.Set[ApiCall]() это мой набор ApiCall s

Я написал функцию, которая будет добавлять в набор, только если нет 3 часть ключа (a, b, c) уже существует в наборе:

def addApiCall(e: X): Unit = {
     val m = _x.find(m => m.a == e.a && m.b == e.b && m.c == e.c)
     if (m.isEmpty)
         _x += e
}

Я тоже не собираюсь иметь слишком много элементов в Set, поэтому я нашел этот подход более простым для меня ..

...