La façon la plus efficace (performance) de supprimer de nombreux éléments de la Liste en Java?

J'ai assez grande Liste des éléments nommés (>= 1 000 000 d'items) et une condition notée par <dir> qui permet de sélectionner les éléments à supprimer et <dir> est vrai pour beaucoup (peut-être la moitié) des articles sur ma liste.

Mon but est de supprimer efficacement les éléments sélectionnés par <dir>, et de conserver tous les autres éléments, la liste des sources ne peut être modifiée, nouvelle liste peut être créée - la meilleure façon de le faire, il doit être choisie en tenant compte de la performance.

Voici mon code de test:

    System.out.println("preparing items");
    List<Integer> items = new ArrayList<Integer>(); //Integer is for demo
    for (int i = 0; i < 1000000; i++) {
        items.add(i * 3); //just for demo
    }

    System.out.println("deleting items");
    long startMillis = System.currentTimeMillis();
    items = removeMany(items);
    long endMillis = System.currentTimeMillis();

    System.out.println("after remove: items.size=" + items.size() + 
            " and it took " + (endMillis - startMillis) + " milli(s)");

et naïf de mise en œuvre:

public static <T> List<T> removeMany(List<T> items) {
    int i = 0;
    Iterator<T> iter = items.iterator();
    while (iter.hasNext()) {
        T item = iter.next();
        //<cond> goes here
        if (/*<cond>: */i % 2 == 0) {
            iter.remove();
        }
        i++;
    }
    return items;
}

Comme vous pouvez le voir, j'ai utilisé index de l'élément modulo 2 == 0 comme supprimer la condition (<dir>) - juste pour démonstation fins.

Quoi de mieux que la version de removeMany peuvent être fournis et pourquoi cette meilleure version est en fait mieux?

  • Quelles mesures de performance en la matière - il suffit de vitesse, ou est l'utilisation de la mémoire important? C'est la liste de courte durée? Chaque entrée de la plus courte (post-supprimer) liste garantis pour être accessible? Je me demande si la création d'une nouvelle liste itérateur qui stocke la suppression de la condition comme un retour condition peut être une solution efficace pour une certaine classe de problèmes. Au lieu de supprimer de la liste, vous pourriez avoir l'itérateur de la méthode next() ignorer les éléments qui ne correspondent pas à l'état. Cela aurait l'avantage de test des entrées sur lequel vous opérez, avec la peine de perdre beaucoup de mémoire.
  • tout comme dans l'exemple ci-dessus: l'entrée est une liste, la sortie est une liste (même avec des éléments sélectionnés supprimés ou une nouvelle conservé des éléments) et la vitesse est ma plus important métriques.
  • merci pour vos réponses! je viens de donner ma réponse, qui compile les différentes approches proposées et les tests dans la pratique. j'espère que mon code ne contient pas d'erreurs et mes conclusions finales sont utiles.
InformationsquelleAutor WildWezyr | 2010-01-11