Я новый для Scala. В качестве упражнения я пытаюсь написать заявление соответствия над списком кортежей с охранниками. Я знаю, что карта решит проблему, но я пытаюсь понять, как сочетать шаблоны.Scala matching Список кортежей с охраной
Я пытаюсь написать функцию, которая принимает аргумент List[(Char, Int)]
. Функция сортирует записи, и если две записи имеют одинаковое значение ключа, они складываются вместе. Таким образом, следующий аргумент List(('q', 1'), ('a', 1), ('c', 2), ('a', 2), ('c', 1))
стал бы List(('a', 3), ('c', 3'), ('q', 1))
.
Я пришел со следующим кодом:
def sortAndAggregateList(chars: List[(Char, Int)]) : List[(Char, Int)] = {
chars match {
case (charP1, numP1) :: (charP2, numP2) :: (x : List[(String, Int)]) if (charP1 > charP2) =>
sortAndAggregateList((charP2, numP2) :: (charP1, numP1) :: x)
case (charP1, numP1) :: (charP2, numP2) :: (x : List[(String, Int)]) if (charP1 < charP2) =>
sortAndAggregateList((charP1, numP1) :: (charP2, numP2) :: x)
case (charP1, numP1) :: (charP2, numP2) :: (x : List[(String, Int)]) if (charP1 == charP2) =>
sortAndAggregateList((charP1, numP1 + numP2) :: x)
case Nil =>
Nil
}
}
Но я получаю следующее предупреждение:
: 14: предупреждение: бесплодными испытания типа: значение списка типа [(Char, Int)] также не может быть List [(String, Int)] (лежащий в основе List [(String, Int)]) (но все равно может совпадать с его стиранием)
Я попытался удалить список, но если я это сделаю, ошибка x
имеет тип Any
.
Любые предложения?
Посмотреть сообщение об ошибке: вы сопрягая против 'chars', который является' List [(Char, Int)] ', но в шаблоне вы ожидаете, что' x' будет 'List [(String, Int)]'. – Josef