通过整数数组从列表中删除对象?

时间:2013-12-21 04:35:46

标签: java arrays list

你好社区我有一个问题,我碰巧在启动时加载了一个对象数组,通过生成数组包含你的代码的另一个整数数组,似乎整数数组删除它们的值,我想要的是比较当前具有的整数数组的列表与对象数组,并删除找到的整个数组所有的代码对象。

我的代码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 :(得分: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();
   } 

}

答案 1 :(得分:0)

目前的尝试失败有多种原因。首先是这一行:

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

测试Integer之间的对象等价,而不是int之间的值等价。如果你想比较Integer s,你必须使用equals方法:

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

但是,如果getCodigo返回intgetSelectedCustomer返回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);