Удаление нескольких диапазонов элемента из списка <Object> - PullRequest
0 голосов
/ 24 мая 2018

Мой список объектов может иметь такие элементы, например, 1:

[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 ... Как очистить исходный список с использованием цикла или потоков?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Использование может сделать это с помощью цикла:

Ниже метод удалит элементы, чьи 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());
}
0 голосов
/ 24 мая 2018

Если вы хотите удалить null элементы из List, вы можете сделать это так же просто, как

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();

. Это позволит объединить смежные и перекрывающиеся диапазоны перед обработкойрезультирующие диапазоны в порядке убывания.

0 голосов
/ 24 мая 2018

Вы можете использовать свою технику с небольшим поворотом: упорядочите свои диапазоны по начальному индексу в порядке по убыванию .Обоснование здесь заключается в том, что до тех пор, пока вы переходите от более высокого индекса к более низкому, а диапазоны не «пересекаются», индексация будет оставаться последовательной.

Следовательно, очистка 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...