Как я могу разделить последовательность целых чисел на диапазоны (java \ kotlin)

Теперь у меня есть такая последовательность

("1,3,5,7,11,13,15,17,21,23,25,27,29,33,35") 

Как я могу разделить на неразрывные диапазоны. Например, мне нужен список с нечетными диапазонами:

 ([1,3,5,7] [11,13,15,17] [21,23,25,27,29] [33,35]) 

UPD. Мой код:

 fun test1 (arr : List<Int>): List<List<Int>>{ var lastElem: Int? = null val arr = ArrayList(arr) Collections.sort(arr) val iter = arr.iterator() val resultList = ArrayList<List<Int>>() val tmlList = ArrayList<Int>() while(iter.hasNext()){ val currElem = iter.next() if (lastElem == null) { lastElem = currElem tmlList.add(currElem) }else if(lastElem+2==currElem){ tmlList.add(currElem) lastElem = currElem }else if(lastElem+2 != currElem){ resultList.add(ArrayList(tmlList)) tmlList.clear() tmlList.add(currElem) lastElem = currElem } } resultList.add(ArrayList(tmlList)) return resultList; } в fun test1 (arr : List<Int>): List<List<Int>>{ var lastElem: Int? = null val arr = ArrayList(arr) Collections.sort(arr) val iter = arr.iterator() val resultList = ArrayList<List<Int>>() val tmlList = ArrayList<Int>() while(iter.hasNext()){ val currElem = iter.next() if (lastElem == null) { lastElem = currElem tmlList.add(currElem) }else if(lastElem+2==currElem){ tmlList.add(currElem) lastElem = currElem }else if(lastElem+2 != currElem){ resultList.add(ArrayList(tmlList)) tmlList.clear() tmlList.add(currElem) lastElem = currElem } } resultList.add(ArrayList(tmlList)) return resultList; } 

UPD. Прошу прощения за код. Я добавил свою версию решения. Я ищу более красивую версию.

Вот один из способов использования map , let :

 val a = ("1,3,5,7,11,13,15,17,21,23,25,27,29,33,35") val nonBreakingRanges = a.split(',') .map { it.toLong() } .let { list -> var lastRange = mutableListOf<Long>() list.map { val previousElement = lastRange.lastOrNull() ?: it if (it == previousElement + 2) { lastRange.add(it) } else { lastRange = mutableListOf(it) } lastRange }.distinct() } 

Вы можете использовать RangeSet из google / guava : Google Core Libraries для Java 6+ :

 val rangeSet: RangeSet<Int> = ImmutableRangeSet.builder<Int>() .apply { sequence.forEach { add(Range.closedOpen(it, it + 2)) } } .build() val nonBreakingRanges = rangeSet.asRanges() .map { ContiguousSet.create(it, DiscreteDomain.integers()).filter { it % 2 != 0 } } 

Вы можете использовать fold :

 val nonBreakingRanges = sequence.fold(mutableListOf<MutableList<Int>>()) { nonBreakingRanges, element -> val lastRange = nonBreakingRanges.lastOrNull() if (lastRange != null && lastRange.lastOrNull() == element - 2) { lastRange.add(element) } else { nonBreakingRanges.add(mutableListOf(element)) } nonBreakingRanges } 

Вы можете использовать groupBy :

 var previousElement: Int? = null var rangeIndex = 0 fun rangeIndexSelector(currentElement: Int): Int { if (previousElement != currentElement - 2) { rangeIndex++ } previousElement = currentElement return rangeIndex } val nonBreakingRanges = sequence.groupBy(::rangeIndexSelector).values 
Intereting Posts
Котлин с картой (маркер не отображается) Список Kotlin для EnumMap с суммами kotlin retrofit-Background sticky concurrent mark sweep GC освобожден 65326 (1448KB) Объекты AllocSpace, 62 (1736KB) Объекты LOS, Как хранить данные типа reified в полях экземпляров в Kotlin? Данные фильтра для FirebaseRecyclerAdapter Быстрое наследование объектов и значение интерфейса Издевательский интерфейс с Kotlin и Mockito Как использовать VectorDrawable в Android <selector> Kotlin: параметр типа Reified делает Gson неудачным Как установить и настроить Kara Web Framework? Java позволяет получить доступ к базовой переменной Kotlin через ее дочерний элемент, но не Kotlin, почему? Как сравнить классы и интерфейсы? Предупреждение безопасности Kotlin Null Неожиданные токены (используйте, чтобы разделить выражения на одной строке) Как создавать функции с совместимыми параметрами / результатами в Котлине? Класс данных Kotlin: как читать значение свойства, если я не знаю его имени во время компиляции?