如何在Java中过滤数组?

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)


Rex*_*err 5

执行此操作的最有效方法 - 如果您正在过滤的谓词价格低廉并且您使用单个线程访问它 - 通常会遍历列表两次:

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方法就是好的.否则,上面的版本表现更好.