Как я могу разделить список на несколько других списков? - PullRequest
0 голосов
/ 19 октября 2018

Я только недавно начал работать со Scala и столкнулся лицом к лицу с проблемой, решение которой, похоже, не могу найти.В общем, мне дан входной текстовый файл с именем «in.txt», который включает в себя строки координат, с которыми я должен работать, как я показал ниже.

2 1
6 6
4 2
2 5
2 6
2 7
3 4
6 1
6 2
2 3
6 3
6 4
6 5
6 7

Я решилиспользовать List для хранения всех значений, чтобы я мог использовать встроенные функции для выполнения вычислений со значениями впоследствии.

val lines = io.Source.fromFile("in.txt").getLines

val coordinates =
  lines
    .drop(0)
    .toList
    .sortWith(_<_)
    .mkString
    .replaceAll("\\s", "")
    .grouped(2)
    .toList

Все работает как надо, как вывод println (координаты) - это

List(21, 23, 25, 26, 27, 34, 42, 61, 62, 63, 64, 65, 66, 67)

Но я хочу создать несколько списков из этого.Например, новый список должен быть создан, если, например, значение начинается с «2», и все значения, начинающиеся с «2», будут помещены в новый список следующим образом:

List(21, 23, 25, 26, 27)

Затем то же самое будет сделано с «3», затем «4» и так далее.

Использование таких функций, как .partition и .groupBy , работает, но с учетом того факта, что значения в координатах также могут достигать 4-значных чисел, и чтоони могут измениться, если исходный файл отредактирован, было бы больно писать все эти условия вручную.В общем, мой вопрос заключается в следующем: возможно ли достичь этого, используя функциональность Scala, какую-то форму итераций?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вы можете сгенерировать все свои входные условия в диапазоне:

val conditions = 1 to 9999

И затем свернуть их, отфильтровав исходный список по каждому из его элементов:

conditions.foldLeft(List():List[List[Int]])((acc, elem) => l.filter(_.toString.startsWith(elem.toString))::acc).filterNot(_.isEmpty)

Вывод

res28: List[List[Int]] = List(List(67), List(66), List(65), List(64), List(63), List(62), List(61), List(42), List(34), List(27), List(26), List(25), List(23), List(21), List(61, 62, 63, 64, 65, 66, 67), List(42), List(34), List(21, 23, 25, 26, 27))
0 голосов
/ 19 октября 2018

Я предполагаю, что ваш файл может состоять из 2, 3, 4, ... цифр.

scala> val l = List("12", "13", "123", "1234")
l: List[String] = List(12, 13, 123, 1234)

scala> val grouped = l.groupBy(s => s.take(s.length - 1)).values
grouped: Iterable[List[String]] = MapLike(List(123), List(12, 13), List(1234))

Если вы хотите это отсортировать:

val grouped = l.groupBy(s => s.take(s.length - 1)).toSeq.sortBy(_._1).map{ case (_, l) => l.sorted}

grouped: Seq[List[String]] = ArrayBuffer(List(12, 13), List(123), List(1234))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...