Удалить IntRanges из ArrayList и разделить результат - PullRequest
0 голосов
/ 17 октября 2019

Представьте себе arraylist, который содержит числа от 1 до 100:

val numbers = ArrayList<Int>()

for (x in 1..100) {
    numbers.add(x)
}

Тогда у нас также есть эти IntRanges:

val range1 = 5..10
val range2 = 15..20
val range3 = 80..90

Я хочу удалить эти диапазоны из ArrayList, а затем разделитьрезультат в IntRanges. Окончательный результат должен выглядеть следующим образом:

val result1 = 1..4
val result2 = 11..14
val result3 = 21..79
val result4 = 91..100

Какое решение вы предлагаете?

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Log.w («здесь ваши диапазоны», результат

0 голосов
/ 17 октября 2019

Это довольно забавное домашнее задание, которое у вас есть :)

Первым делом ответ здесь:

val allItems = (1..100).toList()
val ranges = listOf(5..10, 15..20, 80..90).sortedBy { it.first }
val removedRanges = allItems - (ranges.map { it.toList() }.reduce { a, b-> a + b })
val result = removedRanges
    .mapIndexed { i, it -> it to i }
    .groupBy { it.first - it.second }
    .map { it.value.map { it.first } }
    .map { it.first() .. it.last() }

Log.w("here are your ranges", result.joinToString { "$it" })

Давайте сначала поговорим о том, как работает этот относительно короткий код, это ни в коем случаеидеальное решение, но оно позволяет вам работать с «списком» вместо диапазонов для начального списка.

removeRanges

В kotlin мы можем изменить диапазон на список со всеми его элементами простым методом .toList() и мы можем сделать простую математику с такими списками, иначе listOf (1,2,3) + listOf (5) приведет к [1,2,3,5]. Операция Reduce позволяет вам преобразовать набор T в один элемент T, выполнив операцию, в этом случае мы просто хотим суммировать все диапазоны и удалить их из начального набора, таким образом, removeRanges будет [1, 2, 3, 4, 11,12, ...

result

Идея здесь довольно проста, как обнаружить непрерывные диапазоны с помощью списка целых чисел? Мы группируем их по разнице между их индексом и их значением. Наконец, отобразите их в список и, наконец, вернитесь к диапазонам.

Приветствия и веселье. К сожалению, даже при правильном ответе учитель может спросить вас, как вы пришли к этой идее :) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...