Java或Kotlin-创建尽可能多的子列表

ibrsph3r  于 2023-03-19  发布在  Kotlin
关注(0)|答案(4)|浏览(141)

在Java或Kotlin中,如何创建尽可能多的子列表?如果范围大于列表的大小,它应该忽略超出范围的部分。
我目前有(Kotlin):

val list: List = arrayListOf(1, 2, 3, 4)
list.subList(0, 3) // -> [1, 2, 3]
list.subList(0, 5) // -> IndexOutOfBoundsException
list.subList(0, 200) // -> IndexOutOfBoundsException
list.clear()
list.subList(0, 3) // -> IndexOutOfBoundsException

我想(Kotlin):

val list: List = arrayListOf(1, 2, 3, 4)
list.subList(0, 3) // -> [1, 2, 3]
list.subList(0, 5) // -> [1, 2, 3, 4]
list.subList(0, 200) // -> [1, 2, 3, 4]
list.clear()
list.subList(0, 3) // -> []
pxy2qtax

pxy2qtax1#

你可以在List<T>上写一个扩展来完成这个逻辑:

fun <T> List<T>.safeSubList(fromIndex: Int, toIndex: Int): List<T> =
    this.subList(fromIndex, toIndex.coerceAtMost(this.size))

这使用coerceAtMost来限制最高值。
并称之为:

val list = arrayListOf(1, 2, 3, 4)
println(list.safeSubList(0, 200)) // -> [1, 2, 3, 4]

或者像@gidds建议的那样,我们可以让它更安全:

fun <T> List<T>.safeSubList(fromIndex: Int, toIndex: Int): List<T> = 
    this.subList(fromIndex.coerceAtLeast(0), toIndex.coerceAtMost(this.size))

这个版本防止在两端指定超出范围的数字,如果传入的数字是from〉to,它将从subList抛出一个IllegalArgumentException

blmhpbnm

blmhpbnm2#

在Kotlin你可以

val list = mutableListOf(1, 2, 3, 4)
list.take(3) // -> [1, 2, 3]
list.take(5) // -> [1, 2, 3, 4]
list.take(200) // -> [1, 2, 3, 4]
list.clear()
list.take(3) // -> []

如果愿意,可以检查take的实现。

9rbhqvlz

9rbhqvlz3#

数组列表是在数组上实现的,所以你不能得到比真实的数量多的子列表。

arrayListOf(1, 2, 3, 4)

这意味着,您只能获得0 - 4之间的范围
您可以尝试此操作以避免IndexOutOfBoundsException

int maxRange = yourGivenMaxRange;

    if(maxRange > list.size()){
        maxRange = list.size();
    }

list.subList(0, maxRange) // -> [1, 2, 3]
list.subList(0, maxRange) // -> [1, 2, 3, 4]
list.subList(0, maxRange) // -> [1, 2, 3, 4]
list.clear()
list.subList(0, maxRange) // -> []
jjhzyzn0

jjhzyzn04#

这是工作。

import kotlin.math.max
import kotlin.math.min

fun <T> List<T>.safeSubList(fromIndex: Int, toIndex: Int): List<T> {
    if (fromIndex > toIndex) return emptyList()
    return subList(max(min(fromIndex.coerceAtLeast(0), size), 0), max(min(toIndex.coerceAtMost(size), size), 0))
}

示例)

val a = (1..10).toList()
println(a.safeSubList(9, 10))
println(a.safeSubList(-1, -2))
println(a.safeSubList(1, 0))
println(a.safeSubList(-9, 4))
println(a.safeSubList(4, 5))
println(a.safeSubList(9, 15))

结果)

[10]
[]
[]
[1, 2, 3, 4]
[5]
[10]

相关问题