hsm*_*mit 18 java arrays vector filter java-me
如何在Java中过滤数组?
我有一系列对象,例如汽车:
类:
public class Car{
public int doors;
public Car(int d){
this.doors = d;
}
}
Run Code Online (Sandbox Code Playgroud)
使用:
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);
Run Code Online (Sandbox Code Playgroud)
现在我想过滤汽车阵列,只保留4门以上:
for(int i = 0; i<cars.length; i++){
if(cars[i].doors > 4)
//add cars[i] to a new array
}
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
在我用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]);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我会创建一个具有Vector大小的新数组.然后我再次循环向量并填充新数组.我知道这对于简单的事情来说是一个非常大的过程.
我正在使用J2ME.
Kal*_*see 12
编辑:看到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);
Run Code Online (Sandbox Code Playgroud)
执行此操作的最有效方法 - 如果您正在过滤的谓词价格低廉并且您使用单个线程访问它 - 通常会遍历列表两次:
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;
}
Run Code Online (Sandbox Code Playgroud)
这会遍历列表两次并调用测试两次,但没有额外的分配或复制.Vector风格的方法遍历列表一次,但是分配它所需的内存大约两倍(暂时)并将每个好元素复制两次.因此,如果您要过滤列表的一小部分(或者性能不是问题,通常不是问题),那么Vector方法就是好的.否则,上面的版本表现更好.