2013-12-21 1 views
0

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

Мой код Java:

private List<ValidColumnKey> columnCustomer; 
private int[] selectedCustomer; 

public void init(){ 
    this.setColumnCustomer(new ArrayList<ValidColumnKey>());   
    this.getColumnCustomer().add(new ValidColumnKey(1, "Codigo", "code")); 
    this.getColumnCustomer().add(new ValidColumnKey(2, "Nombre", "name")); 
    this.getColumnCustomer().add(new ValidColumnKey(3, "Nombre Comercial", "comercialName")); 
    this.getColumnCustomer().add(new ValidColumnKey(4, "Estado", "isActive")); 

    this.setSelectedCustomer(new int [this.getColumnCustomer().size()]); 
    int i = 0; 
    for(ValidColumnKey column : this.getColumnCustomer()){ 
     this.getSelectedCustomer()[i] = column.getCodigo(); 
     i++; 
    } 
} 

Я имею в виду, я бы мой массив целых чисел с кодами удалены, например:

selectedCustomer = [1, 2, 3]; 

То, что я хотел, чтобы удалить из списка объектов, не имеют кодов в массиве целых чисел, но это не мой код:

List<ValidColumnKey> auxRemoColumnKeys = new ArrayList<ValidColumnKey>(); 
for(ValidColumnKey column : this.getColumnCustomer()){ 
    for(Integer codigo : this.getSelectedCustomer()){ 
     if (column.getCodigo() != codigo) { 
      auxRemoColumnKeys.add(column); 
      break; 
     } 
    }   
} 
this.getColumnCustomer().remove(auxRemoColumnKeys); 

Я мог бы руководствоваться решение.

+2

Я очень смущен, что ваш вопрос ...что представляет собой вход/выход –

+0

Привет друг в общедоступном методе init(), он загрузит значения двух списков (Объекты и целые числа), после того, как процесс удалит некоторые значения из списка целых чисел, и эти значения удаляются, я удаляю их из списка объектов. Выход - это вопрос. – user2974805

ответ

0
this.getColumnCustomer().remove(auxRemoColumnKeys); 

Это утверждение предполагает, что вы имеете действительный equals метод для вашего класса ValidColumnKey, который я подозреваю, вероятно, не тот случай.

Что вы хотите сделать, это перебрать с помощью Iterator. Пример кода может быть

Set<Integer> toRemoveCodes = new HashSet<Integer>(Arrays.asList(1, 2, 3)); 
for (Iterator<ValidColumnKey> it = this.getColumnCustomer().iterator(); it.hasNext();) { 
    ValidColumnKey curColumnKey = it.next(); 
    Integer code = curColumnKey.codigo(); 
    if (toRemoveCodes.contains(code)) { 
     it.remove(); 
    } 

} 
+0

Спасибо большое друг. – user2974805

+0

* «Это утверждение предполагает, что у вас есть действительный метод равенства» * Идентификатор объекта подходит для этого, потому что OP добавляет элементы в список удаления, которые исходят из самого исходного списка. – Radiodef

+0

@ Radiodef Исправить. Все будет работать так, как ожидалось, если OP использовал 'removeAll', удалил оператор' break' и цикл 'codigo'. Но просто глядя на код, разве вы не ожидали бы метода 'equals'? – bsd

0

Существует несколько причин, по которым ваша текущая попытка не срабатывает. Во-первых, этой линии:

if (column.getCodigo() != codigo) { 

тестирует для объекта эквивалентности между Integer с, не значение equavalence между int с. Если вы хотите сравнить Integer с, вы должны использовать метод Equals:

if (!column.getCodigo().equals(codigo)) { 

Однако, если getCodigo возвращает int и getSelectedCustomer, возвращает int[] то эта строка должна быть изменена вместо:

for(int codigo : this.getSelectedCustomer()){ 

Потому что вам не нужно было использовать Integer.

Во-вторых, эта линия пытается удалить auxRemoColumnKeys себя так, вы, вероятно, означает removeAll:

this.getColumnCustomer().remove(auxRemoColumnKeys); 

Наконец, ваша логика, как правило, недостатки. Он в основном говорит «для каждого элемента в getColumnCustomer, если getCodigo не равен всем getSelectedCustomer, удалите его». Я не думаю, что это то, что вы намеревались.

Это модифицированный цикл, который использует тот же «добавить в список и удалить пункты списка» процедуру, но логика будет работать:

List<ValidColumnKey> auxRemoColumnKeys = new ArrayList<ValidColumnKey>(); 
int[] selected = this.getSelectedCustomer(); 

for (ValidColumnKey column : this.getColumnCustomer()) { 
    int i = 0; 
    for (; i < selected.length; i++) { 

     /* note: if getCodigo returns an Integer change this check to 
     * "if (column.getCodigo().equals(selected[i])) {" 
     */ 
     if (column.getCodigo() == selected[i]) { 
      break; 
     } 
    } 

    /* this says "if the search loop did not break early" */ 
    if (i == selected.length) { 
     auxRemoColumnKeys.add(column); 
    } 
} 
this.getColumnCustomer().removeAll(auxRemoColumnKeys); 
+0

OP просто хочет удалить идентификаторы. Иды не нужно сортировать. Это не будет работать для несортированных идентификаторов. 'removeAll', вероятно, приведет к временной сложности O (n ** 2), и поиск идентификаторов, вероятно, в худшем случае приведет к другому O (n ** 2). – bsd

+0

Не уверен, что вы имеете в виду в отношении сортировки/несортировки, хотя в моем коде тоже была ошибка (oops). О временной сложности я мог бы лично сделать это по-другому, но я не думаю, что он учит чему-то просто сказать: «У вашего пути есть ошибки, так что вот еще один способ». Передача решения, которое значительно отличается, решает проблему, но скорее напоминает ярлык и не показывает кому-то, как самостоятельно решать свои решения. – Radiodef

+0

Хорошо, вы исправили ошибку. Извините, если бы я казался грубым. О сложности, допустим, у OP был список, в котором идентификаторы 'ValidColumnKey' находятся в порядке убывания, а идентификаторы для удаления находятся в порядке возрастания. Таким образом, первый элемент для удаления находится в конце списка, а второй элемент для удаления находится во второй последней позиции и так далее. Поэтому, когда вы добавляете шаги - это выглядит как: n + (n-1) + (n-2) + .. 3 + 2 + 1 = O (n ** 2). 'removeAll' также работает одинаково. – bsd

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