2014-11-13 2 views
1

У меня есть функция в Java, какПроблемы при удалении подсписка из списка в Java

void remove(List<Var> vars, List<List<Value>> vals) { 
    int index = calculateIndex(); 
    vars.removeAll(vars.subList(index, vars.size())); 
    vals.removeAll(vals.subList(index, vals.size())); 

}

всегда оба списка имеет одинаковое количество элементов, прежде чем ввести метод, но, после того, как RemoveAll варов есть один элемент больше, чем vals, индекс находится между нулем и размером списков, почему это может произойти?

+2

Список 'Var' или' Value'? –

+0

Должен быть того же типа, если вы хотите использовать 'removeAll()' ... – brso05

+2

'removeAll' - неправильный метод для того, что, я думаю, вы пытаетесь выполнить. Я думаю, вы хотите 'vars.subList (...). Clear()'. – ajb

ответ

3

Если я правильно понял, что вы пытаетесь сделать, код для удаления подсписки должен выглядеть

int index = calculateIndex(); 
vars.subList(index, vars.size()).clear(); 
vals.subList(index, vals.size()).clear(); 

removeAll не является правильным инструментом для работы. Целью removeAll является просмотр всех элементов в коллекции A и удаление элементов в коллекции B, которые равны любому элементу в коллекции A. Я считаю, что он использует .equals, чтобы определить, какие элементы равны, а не ссылочное равенство, что означает, что вы можете удалить некоторые элементы, которые вы не собираетесь удалять. Кроме того, так как коллекция A в этом случае была бы подвыпиской коллекции B, так что они перекрывались бы, я бы не рассчитывал, что removeAll будет функционировать правильно, хотя это может быть; использование перекрывающихся списков в этой ситуации может привести к хаосу.

+0

Я думал, что с помощью подсписок 'removeAll' будет работать, спасибо! – bionicCat

0

Как альтернативный дизайн, а не обязательно на дорожке, я думаю, что это был бы более приятный метод, если бы вы на самом деле создали новый список, содержащий разницу, и вернули его, сохраняя оба оригинальных списка, в противном случае его слабый запах кода.

т.е.

List<Var> difference(List<Var> vars, List<List<Value>> vals) { 
    List<Var> results = new ArrayList<Var>(); 

    // Loop through Vars and Vals appropriately adding Var to results based on some criteria 
    // .... 

    return results; 
} 

Таким образом, вы сохранить список вары от появления волшебно меняется, когда передается в качестве входного параметра для метода.

Смежные вопросы