Comment filtrer un tableau en Java?
Comment puis-je filtrer un tableau en Java?
J'ai un tableau d'objets, par exemple les voitures:
Classe:
public class Car{
public int doors;
public Car(int d){
this.doors = d;
}
}
Utilisation:
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);
Maintenant, je veux filtrer le tableau de voitures, de ne garder que 4 portes et plus:
for(int i = 0; i<cars.length; i++){
if(cars[i].doors > 4)
//add cars[i] to a new array
}
}
Comment dois-je faire cela?
Avant je l'ai fait avec un Vecteur:
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]);
}
}
Et puis je ferais un tableau avec la taille du Vecteur. Alors je boucle sur le vecteur de nouveau et remplissez le tableau. Je sais que c'est un très grand procédure pour quelque chose de simple.
Je suis en utilisant J2ME.
Est-il vraiment si important à vos contenants sont des tableaux et non des vecteurs? Parce que les vecteurs qu'un son, comme la bonne chose à utiliser.
Eh bien, je ne peux pas utiliser Vector <Voiture> voitures dans mon environnement. Donc, je dois faire des moulages de tous les temps, ce qui peut être difficile...
Eh bien, je ne peux pas utiliser Vector <Voiture> voitures dans mon environnement. Donc, je dois faire des moulages de tous les temps, ce qui peut être difficile...
OriginalL'auteur hsmit | 2010-01-17
Vous devez vous connecter pour publier un commentaire.
EDIT: vu que ArrayList n'est pas en J2ME, mais sur la base de la documentation, il ne disposent d'un Vecteur. Si la classe Vector est différent de celui de J2SE Vecteur (comme cette documentation indique), alors peut-être le code suivant devrait fonctionner:
Je ne savais pas que le Vecteur se comporte différemment, peut-être essayer le deuxième morceau de code que j'ai ajouté.
vous pourriez vouloir initialiser le vecteur avec des voitures.longueur. il serait peut-être plus efficace.
OriginalL'auteur Kaleb Brasee
Le moyen le plus efficace pour ce faire, si le prédicat vous êtes le filtrage est peu coûteux et vous êtes accédant avec un seul thread--est généralement la traversée de la liste deux fois:
Ce parcourt la liste à deux reprises et appelle le test deux fois, mais n'a pas de supplément d'allocations ou de la copie. Le Vecteur de style méthodes de la traversée de la liste une fois, mais alloue environ le double de la mémoire dont il a besoin (transitoirement) et des copies de tous les bons élément deux fois. Donc, si vous êtes de filtrage pour une petite fraction de la liste (ou de la performance n'est pas un problème, ce qui, très souvent, il n'est pas), alors le Vecteur de la méthode est bonne. Sinon, la version ci-dessus fonctionne mieux.
OriginalL'auteur Rex Kerr
Si vous avez vraiment besoin d'un simple tableau comme le résultat, je pense que votre chemin est le chemin à parcourir: vous ne savez pas le nombre d'éléments résultant avant de filtre, et vous ne pouvez pas construire une nouvelle matrice, sans connaître le nombre d'éléments.
Toutefois, si vous n'avez pas besoin de thread de sécurité, pensez à utiliser
ArrayList
au lieu d'unVector
. Il devrait être un peu plus rapide. Ensuite utiliser ArrayList esttoArray
méthode pour obtenir le tableau.Ah, bon point. Donc, cela se résume à un choix entre l'utilisation de la mémoire contre vitesse: Soit créer un Vecteur intermédiaire et d'obtenir la matrice de ce que (qui est rapide, mais prend de la mémoire), ou la traversée de la liste deux fois, la première fois seulement pour trouver le nombre d'éléments, et la deuxième fois pour remplir un tableau de cette taille (ce qui est probablement plus lent, mais produit moins de déchets).
Ne pas utiliser une ArrayList, l'utilisation d'une LinkedList si vous ne connaissez pas le nombre d'éléments à l'avance. Ajout de nouveaux champs à une ArrayList est plus cher, que d'une LinkedList, en raison de leur structure interne.
OriginalL'auteur Joonas Pulakka
Je ne vois pas beaucoup de mal avec votre code. Vous pouvez simplement coller avec des Vecteurs tout le long.
Vous pouvez simplifier la seconde partie (où vous copiez les éléments correspondants dans le tableau) à l'aide de Vecteur.copyInto(Object[]).
OriginalL'auteur finnw
Il n'y a pas de moyen direct pour supprimer des éléments d'un tableau, sa taille est fixe. Quoi que vous fassiez, vous devez allouer un nouveau tableau en quelque sorte.
Si vous voulez éviter le mineur surcharge de la mémoire de l'attribution d'une
Vector
, une autre option serait de faire deux passages au-dessus de votre tableau. La première fois, il suffit de compter le nombre d'éléments que vous souhaitez conserver. Alors allouer un tableau de cette taille, et de la boucle sur votre ancien tableau encore une fois, la copie des éléments correspondants dans le nouveau tableau.Je voudrais
OriginalL'auteur Porculus
Vous pouvez utiliser
System.arrayCopy()
:Mise à JOUR:
System.arrayCopy
est disponible dans API Java ME, à la différence de Vecteur.sous-liste(). Merci pour la correction.Système.arrayCopy() sont disponibles dans Java ME, mais pas
Vector.subList()
.OriginalL'auteur notnoop
Vous aurez besoin de créer un nouveau tableau de toute façon.
Ce n'est pas assez efficace, bien que.
java.util.Iterator
dans Java ME: java.sun.com/javame/reference/apis/jsr139oups 🙂 comment se fait-je l'ai oublié. (Mise à jour)
OriginalL'auteur Bozho