How to filter an array in Java?

后端 未结 7 967
小蘑菇
小蘑菇 2020-12-10 02:01

How can I filter an array in Java?

I have an array of objects, for example cars:

Class:

public class Car{
    public int doors;
    public Ca         


        
相关标签:
7条回答
  • 2020-12-10 02:45

    You can use System.arrayCopy():

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

    UPDATE: System.arrayCopy is available in Java ME API, unlike Vector.subList(). Thanks for the correction.

    0 讨论(0)
  • 2020-12-10 02:48

    There's no direct way to remove elements from an array; its size is fixed. Whatever you do, you need to allocate a new array somehow.

    If you want to avoid the minor memory overhead of allocating a Vector, another option would be to make two passes over your array. The first time, simply count the number of elements that you want to keep. Then allocate an array that size, and loop over your old array again, copying matching elements into the new array.

    0 讨论(0)
  • 2020-12-10 02:48

    You will need to create a new array anyway.

    Vector vector = new Vector(array.length);
    
    for (int i = 0; i < array.length; i++) {
        if (array[i].doors > 4) {
            vector.add(array[i]);
        }
    }
    
    Car[] result = new Car[vector.size()];
    vector.copyInto(result);
    

    This isn't quite efficient, though.

    0 讨论(0)
  • 2020-12-10 02:50

    I can't see much wrong with your code. You could just stick with Vectors throughout though.

    You could simplify the second part (where you copy the matching items into the new array) using Vector.copyInto(Object[]).

    0 讨论(0)
  • 2020-12-10 02:51

    EDIT: saw that ArrayList is not in J2ME, but based on documentation, it does have a Vector. If that Vector class is different than J2SE Vector (as this documentation indicates), then perhaps the following code would work:

    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);
    
    0 讨论(0)
  • 2020-12-10 02:56

    If you really need a plain array as the result, I think your way is the way to go: you don't know the number of resulting elements before you filter, and you can't construct a new array without knowing the number of elements.

    However, if you don't need thread-safety, consider using ArrayList instead of a Vector. It ought to be somewhat faster. Then use ArrayList's toArray method to get the array.

    0 讨论(0)
提交回复
热议问题