有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中过滤数组?

如何在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 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


共 (6) 个答案

  1. # 1 楼答案

    我看不出你的代码有什么错。不过,你可以始终坚持使用向量

    您可以使用Vector简化第二部分(将匹配项复制到新数组中)。copyInto(对象[])

  2. # 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;
    }
    

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

  3. # 3 楼答案

    编辑:看到ArrayList不在J2ME中,但根据文档,它确实有一个向量。如果该Vector类不同于J2SE Vector(如this documentation indicates),那么以下代码可能会起作用:

    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);
    
  4. # 4 楼答案

    如果你真的需要一个简单的数组作为结果,我认为你的方法就是这样:你在过滤之前不知道结果元素的数量,你不能在不知道元素数量的情况下构建一个新的数组

    但是,如果您不需要线程安全性,考虑使用^ {CD1>}而不是^ {< CD2>}。应该快一点。然后使用ArrayList的toArray方法获取数组

  5. # 5 楼答案

    没有直接的方法从数组中删除元素;它的大小是固定的。无论您做什么,都需要以某种方式分配一个新数组

    如果您想避免分配Vector所带来的较小内存开销,另一种选择是对数组进行两次遍历。第一次,只需计算要保留的元素数。然后分配一个大小相同的数组,再次循环旧数组,将匹配的元素复制到新数组中

  6. # 6 楼答案

    您可以使用System.arrayCopy()

    Car[] cars = ...
    int length = cars.length < 4 ? cars.length() : 4;
    Car filter = new Car[4];
    System.arrayCopy(cars, 0, filter, 0, length);
    

    更新:System.arrayCopyJava ME API中可用,与Vector不同。子列表()。谢谢你的更正