[英]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.