20 Stimmen

Wie filtert man ein Array in Java?

Wie kann ich ein Array in Java filtern?

Ich habe eine Reihe von Objekten, zum Beispiel Autos:

Klasse:

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

Verwendung:

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);

Jetzt möchte ich die Liste der Autos filtern und nur die 4-Türer und mehr behalten:

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

Wie soll ich das machen?

Vorher habe ich es mit einem Vector gemacht:

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]);
    }
}

Und dann würde ich ein neues Array mit der Größe des Vektors erstellen. Dann würde ich eine Schleife über den Vektor wieder und füllen Sie das neue Array. Ich weiß, dies ist ein sehr großes Verfahren für etwas Einfaches.

Ich verwende J2ME.

13voto

Kaleb Brasee Punkte 49955

EDIT。 sah, dass ArrayList nicht in J2ME, aber basierend auf der Dokumentation, es hat einen Vektor. Wenn diese Vector Klasse anders ist als J2SE Vector (als diese Dokumentation gibt an ), dann würde vielleicht der folgende Code funktionieren:

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);

6voto

Rex Kerr Punkte 164629

Der effizienteste Weg, dies zu tun - wenn das Prädikat, nach dem Sie filtern, kostengünstig ist und Sie mit einem einzigen Thread darauf zugreifen - ist normalerweise, die Liste zweimal zu durchlaufen:

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;
}

Dies durchläuft die Liste zweimal und ruft den Test zweimal auf, hat aber keine zusätzlichen Zuweisungen oder Kopiervorgänge zur Folge. Die Vektormethoden durchlaufen die Liste einmal, belegen aber etwa doppelt so viel Speicher wie nötig (vorübergehend) und kopieren jedes gute Element etwa zweimal. Wenn Sie also nur einen winzigen Teil der Liste filtern (oder die Leistung kein Problem darstellt, was sehr oft nicht der Fall ist), dann ist die Vector-Methode gut. Andernfalls ist die obige Version besser geeignet.

2voto

Joonas Pulakka Punkte 35583

Wenn Sie wirklich ein einfaches Array als Ergebnis benötigen, denke ich, dass Ihre Methode der richtige Weg ist: Sie kennen die Anzahl der resultierenden Elemente nicht, bevor Sie filtern, und Sie können kein neues Array erstellen, ohne die Anzahl der Elemente zu kennen.

Wenn Sie jedoch keine Thread-Sicherheit benötigen, sollten Sie die Verwendung von ArrayList anstelle einer Vector . Das sollte etwas schneller sein. Dann verwenden Sie ArrayList's toArray Methode, um das Array zu erhalten.

1voto

notnoop Punkte 57727

Sie können verwenden 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 ist erhältlich in Java ME API im Gegensatz zu Vector.subList(). Danke für die Korrektur.

1voto

finnw Punkte 46519

Ich kann an Ihrem Code nicht viel aussetzen. Sie könnten nur mit Vektoren durchweg obwohl bleiben.

Sie können den zweiten Teil (wo Sie die übereinstimmenden Elemente in das neue Array kopieren) mit Vector.copyInto(Object[]) vereinfachen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X