繁体   English   中英

从List中删除多个元素范围<Object>

[英]Removing multiple ranges of element from a List<Object>

我的对象列表可以有这样的元素eg1:

[vale11, value12, value13, null, null, null, value21, value22, value23, value31, value32, value33]

EG2:

[vale11, value12, value13, null, null, null, null, null, null, value31, value32, value33]

EG3:

[vale11, value12, value13, null, null, null, value21, value22, value23, null, null, null]

EG4:

[vale11, null, value13, null, null, null, value21, value22, value23, value31, value32, null]

我想删除空值但不是全部(注意eg4 ),只有那些从某个索引开始的范围内。 所以在eg1中会是这样的:

list.sublist(3, 6).clear();

eg2

list.sublist(3, 6).clear();
list.sublist(6, 9).clear();//it's not going to work

我知道起始索引和一些下一个元素(总是相同的)

有时它会是1个范围,有时是3个,5个......如何使用循环或流清除原始列表?

您可以稍微使用您的技术:按初始索引降序排列范围。 这里的基本原理是,只要您从较高的索引到较低的索引,并且范围不“交叉”,索引将保持一致。

因此,清除sublist(6, 9)后跟sublist(3, 6)将正常工作:

//  0        1       2       3     4     5     6     7     8      9       10       11
[vale11, value12, value13, null, null, null, null, null, null, value31, value32, value33]
//                                           ^^^^^^^^^^^^^^^^ [6, 9)
//                         ^^^^^^^^^^^^^^^^ [3, 6)

使用可以循环:

下面的方法将删除其startIndex <= index <= endIndex的元素

<T> List<T> chopList(List<T> originalList, int startIndex, int endIndex) {
    // Your code to check original list, validate startIndex, endIndex must inrange...
    return IntStream.range(0, originalList.size() - 1)
                    .filter(i -> i < startIndex || i > endIndex)
                    .mapToObj(originalList::get)
                    .collect(toList());
}

如果要从List删除null元素,可以像执行一样简单

list.removeIf(Objects::isNull);

当然,您可以将操作限制在某个范围内

list.subList(start, end).removeIf(Objects::isNull);

如果实际任务是从列表中删除预定义范围(并且在这些位置可能存在null元素的信息实际上是无关紧要的),则可以使用此答案 (按降序处理范围),如果范围不交叠。

如果范围可能重叠,您可以使用

BitSet toRemove = new BitSet(list.size());
toRemove.set(firstRangeStart, firstRangeEnd);
toRemove.set(secondRangeStart, secondRangeEnd);
// etc
for(int e = toRemove.length(), s; e > 0; e = toRemove.previousSetBit(s)+1)
    list.subList((s=toRemove.previousClearBit(e-1))+1, e).clear();

这将在按降序处理结果范围之前融合相邻和重叠范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM