1
votes

Supprimer les nombres supérieurs à x dans une ArrayList

Je suis un noob en java et en ce moment j'apprends les génériques. Ce code doit supprimer tout entier supérieur à cinq. J'ai tapé [10, 11, 12, 1], en théorie, je ne devrais obtenir que [3, 4, 6, 1]. Mais j'obtiens [3, 4, 6, 11 , 1], je ne comprends pas pourquoi ..?

public static void main(String args[]) throws IOException{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(3);
    list.add(4);
    list.add(56);
    list.add(6);

    for (int i = 0; i < 4; i++){
        String s = reader.readLine();
        list.add(Integer.parseInt(s));
    }

    for (int i = 0; i < list.size(); i++){
        if (list.get(i) > 5)
            list.remove(i);
        //else
            //i++;
    }
    System.out.println(list);
}

10 11 12 1

[3, 4, 6, 11, 1]


9 commentaires

Pourquoi [10, 11, 12, 1] doit-il afficher [3, 4, 6, 1] ? Et votre code n'a de toute façon pas [10, 11, 12, 1] .


@Gendarme La liste est pré-remplie avec 3,4,56,6, puis l'entrée utilisateur est ajoutée, d'où provient le 10,11,12,1.


Oh, je vois ça maintenant.


@OP, si le code est censé supprimer les nombres supérieurs à 5, comment la sortie attendue peut-elle inclure un 6?


Ce n'est pas une question particulièrement Java. En Java, vous devrez filtrer votre liste par condition élément <= x à l'aide de l'API de flux: mylist.stream (). Filter (i -> i <= x) .collect (Collectors .toList ())


Double possible de Itération dans une collection, évitant ConcurrentModificationException lors de la suppression d'objets dans une boucle


@tsolakp L'OP n'utilise pas de boucle for améliorée et ne rencontrera donc jamais de problèmes de modification simultanée.


@azurefrog oui 11 et 6 :)


@ azurefrog je sais. Mais le post lié montre comment supprimer en toute sécurité dans la boucle.


4 Réponses :


2
votes

Si vous lisez la documentation de List.remove () , vous verrez que les éléments après l'index i sont décalés vers la gauche. Cela signifie que dans votre implémentation actuelle, vous sautez un élément après chaque suppression, donc s'il y a deux éléments côte à côte qui sont plus grands que 5, un seul d'entre eux sera supprimé.

Ce que vous pouvez faire est de recule également l'index actuel d'une étape après avoir supprimé un élément avec i--; Votre code deviendrait ainsi

public static void main(String args[]) throws IOException{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(3);
    list.add(4);
    list.add(56);
    list.add(6);

    for (int i = 0; i < 4; i++){
        String s = reader.readLine();
        list.add(Integer.parseInt(s));
    }

    for (int i = 0; i < list.size(); i++){
        if (list.get(i) > 5) {
            list.remove(i);
            i--;
        }
    }
    System.out.println(list);
}

Cela affichera [3, 4, 1] , en supprimant tous les nombres supérieurs à 5. p >


0 commentaires

3
votes

Si vous utilisez Java 8+, vous pouvez simplement utiliser ArrayList :: removeIf comme ceci:

list.removeIf(i -> i > 5);

démo ideone


0 commentaires

0
votes

J'imagine que c'était l'exercice pour comprendre comment supprimer d'une liste, mais sinon, voici comment vous pourriez vérifier avant d'y ajouter:

  public static void main(String args[]) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();



    for (int i = 0; i < 4; i++){
        System.out.println("type a number: ");
        String s = reader.readLine();
        int j = Integer.parseInt(s);
        if(j < 5) {
            list.add(Integer.parseInt(s));
        }
    }


    System.out.println(list);
}


0 commentaires

1
votes

Si vous démarrez la vérification depuis la fin du tableau, cela fonctionne.

public static void main(String args[]) throws IOException{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(3);
    list.add(4);
    list.add(56);
    list.add(6);

    for (int i = 0; i < 4; i++){
        String s = reader.readLine();
        list.add(Integer.parseInt(s));
    }

    for (int i = list.size() - 1; i >=0 ; i--){
        if (list.get(i) > 5)
            list.remove(i);
    }
    System.out.println(list);
}

10 11 12 1
[3, 4, 1]


0 commentaires