программа для обработки гетерогенных списков в Scala; - PullRequest
0 голосов
/ 18 февраля 2020

Я должен выяснить максимум / минимум из этого списка:

 val data= List(List(1,2), List(3,4,91,9,10),11,211,456,345)

Из некоторого примера стека над потоком, я вижу решение ниже:

val flatdata=data.collect{case i:Int => List(i); case l @ a :: b => l}.flatten

[Но это дает ошибку] ​​

Может кто-нибудь, пожалуйста, помогите. хочу решение с использованием чистого scala, а не искры

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Давайте go рассмотрим ваш код более подробно:

sacla> val data= List(List(1,2), List(3,4,91,9,10),11,211,456,345)
data: List[Any] = List(List(1, 2), List(3, 4, 91, 9, 10), 11, 211, 456, 345)

Тип данных - List[Any], поскольку список не является одним указанным c типом. Компилятор пытается определить тип, но поскольку Int и List[Int] несовместимы, он разрешается до Any.

scala> data.collect{case i:Int => List(i); case l @ a :: b => l}
res0 List[List[Any]] = List(List(1, 2), List(3, 4, 91, 9, 10), List(11), List(211), List(456), List(345))

Во второй части попытка объединить записи, чтобы они были Список списков. Он соответствует Int и оборачивает его в List.

Однако вы видите, что тип здесь все еще List[List[Any]].

Теперь последняя часть, .flatten

scala> res0.flatten
res1: List[Any] = List(1, 2, 3, 4, 91, 9, 10, 11, 211, 456, 345)

Это займет у вас от List[List[Any] до List[Any].

Теперь ключевым моментом здесь является то, что если вы попытаетесь вызвать .max или .min в этом списке, это не сработает. Так как Ordering для Any.

<console>:13: error: No implicit Ordering defined for Any.

не существует, исправление будет заключаться в принудительном вызове этого типа в исходном вызове collect.

scala> data.collect{case i:Int => List(i); case l : List[Int] => l}
res6: List[List[Int]] = List(List(1, 2), List(3, 4, 91, 9, 10), List(11), List(211), List(456), List(345))


scala> .flatten
res7: List[Int] = List(1, 2, 3, 4, 91, 9, 10, 11, 211, 456, 345)

scala> .max
res8: Int = 456

scala> res7.min
res9: Int = 1

1 голос
/ 18 февраля 2020

Что-то не так с вашим кодом в том, что результатом является List[Any], что не очень полезно.

Это выдает предупреждение компилятора, но выдает результат List[Int].

data.flatMap{case li:List[Int] => li; case i:Int => List(i)}
0 голосов
/ 18 февраля 2020

В вашем коде нет ничего плохого, он оценивается нормально. Не уверен, какую ошибку вы получаете.

scala>  val data= List(List(1,2), List(3,4,91,9,10),11,211,456,345)
data: List[Any] = List(List(1, 2), List(3, 4, 91, 9, 10), 11, 211, 456, 345)

scala> data.collect{case i:Int => List(i); case l @ a :: b => l}
res0: List[List[Any]] = List(List(1, 2), List(3, 4, 91, 9, 10), List(11), List(211), List(456), List(345))

scala> data.collect{case i:Int => List(i); case l @ a :: b => l}.flatten
res1: List[Any] = List(1, 2, 3, 4, 91, 9, 10, 11, 211, 456, 345)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...