如何在Java中过滤数组?

2022-09-02 04:04:26

如何在Java中过滤数组?

我有一个对象数组,例如汽车:

类:

public class Car{
    public int doors;
    public Car(int d){
        this.doors = d;
    }
}

用:

Car [] cars = new Cars[4];
cars[0] = new Car(3);
cars[1] = new Car(2);
cars[2] = new Car(4);
cars[3] = new Car(6);

现在我想过滤一系列汽车,只保留4个门和更多:

for(int i = 0; i<cars.length; i++){
    if(cars[i].doors > 4)
         //add cars[i] to a new array
    }
}

我应该怎么做?

在我用Vector做之前:

Vector subset = new Vector();
for(int i = 0; i<cars.length; i++){
    if(cars[i].doors > 4)
         //add cars[i] to a new array
        subset.addElement(cars[i]);
    }
}

然后我会用矢量的大小制作一个新的数组。然后,我会再次循环访问矢量并填充新数组。我知道对于简单的事情来说,这是一个非常大的过程。

我正在使用J2ME。


答案 1

编辑:看到ArrayList不在J2ME中,但基于文档,它确实有一个Vector。如果该 Vector 类与 J2SE Vector 不同(如本文档所示),则以下代码可能有效:

Vector carList = new Vector();
for(int i = 0; i<cars.length; i++){
    if(cars[i].doors > 4)
         carList.addElement(cars[i]);
    }
}
Car[] carArray = new Car[carList.size()];
carList.copyInto(carArray);

答案 2

执行此操作的最有效方法(如果您正在筛选的谓词成本低廉并且您使用单个线程访问它)通常是遍历列表两次:

public Car[] getFourDoors(Car[] all_cars) {
  int n = 0;
  for (Car c : all_cars) if (c.doorCount()==4) n++;
  Car[] cars_4d = new Car[n];
  n = 0;
  for (Car c : all_cars) if (c.doorCount()==4) cars_4d[n++] = c;
  return cars_4d;
}

这将遍历列表两次并调用测试两次,但没有额外的分配或复制。Vector 样式的方法遍历列表一次,但分配大约两倍的内存(暂时),并复制每个好元素大约两次。因此,如果您正在过滤列表的一小部分(或者性能不是问题,通常不是),那么Vector方法很好。否则,上述版本的性能会更好。