1
votes

Éliminer les caractères répétés dans une chaîne

Bonjour, j'essaie de faire fonctionner cette pièce de sorte que lorsque l'entrée est une chaîne telle que "aaabbbccdddeef", la sortie est "abcdef". Je sais qu'il existe des solutions, mais cela me dérange que cela ne fonctionne pas et je ne vois pas pourquoi. J'apprécierais vraiment que quelqu'un puisse me donner un coup de main pour comprendre pourquoi ce morceau de code ne fonctionne pas.

    Scanner input = new Scanner(System.in);
    System.out.print("please enter the string of characters: " );
    String str = input.nextLine();
    char[] store = new char[str.length()]; 
    int count =0;

    for(int i=0; i<str.length();i++) {

        for (int j=0; j<str.length(); j++) {

                if(str.charAt(i)==store[j] ){
                    count+=1;//when character not stored keep count to offset store position
                    break;
                }else {store[i-count] = str.charAt(i); count = 0;}
            }
        }
    System.out.println(str);
    System.out.print(store);


3 commentaires

Merci @ScaryWombat mais une idée de ce qui ne va pas avec ça? parce que cela m'a rendu fou ces dernières heures T_T


oui, c'est une réinitialisation pour décaler l'index lorsque vous ne stockez pas un caractère et il compare a à un null, je l'ai testé en initialisant tout le tableau du magasin avec '*' et cela ne fonctionne toujours pas.


Si vous ne souhaitez pas utiliser les réponses fournies ici, je vous suggère d'utiliser un débogueur et de parcourir le code


4 Réponses :


-1
votes

Cela peut être une solution simple, mais aussi une solution très complexe.

Ma solution est très simple à mon avis: Créez une boucle for qui parcourt toute la longueur de la chaîne Ensuite, utilisez l'index de + charAt pour déterminer si une chaîne se répète sur 1 Créez une nouvelle chaîne appelée temp. Ensuite, si c'est le cas, supprimez chacun de ces caractères en n'en laissant qu'un Puis imprimez temp

String.indexOf('a');


1 commentaires

Pas le downvoter, mais la question n'était pas de savoir "comment" résoudre le problème, mais "pourquoi" la solution publiée n'a pas fonctionné



2
votes

Une autre façon serait d'ajouter à un StringBuilder s'il n'existe pas

    Scanner input = new Scanner(System.in);
    System.out.print("please enter the string of characters: " );
    String str = input.nextLine();
    StringBuilder store = new StringBuilder ();

    for(int i=0; i<str.length();i++) {
        if (!store.toString().contains(Character.toString(str.charAt(i)))) {
            store.append(str.charAt(i));
        }
    }
    System.out.println(str);
    System.out.print(store);


0 commentaires

1
votes

Besoin de changer la logique à l'intérieur de la deuxième boucle for . vous devez itérer store et non la str dans la deuxième boucle for. Vérifier ma solution:

    Scanner input = new Scanner(System.in);
    System.out.print("please enter the string of characters: ");
    String str = input.nextLine();
    char[] store = new char[str.length()];
    int count = 0;
    boolean charInStore = false;
    for (int i = 0; i < str.length(); i++) {
        charInStore = false;
        for (int j = 0; j < store.length; j++) {
            if (str.charAt(i) == store[j]) {
                charInStore = true;
                break;
            }
        }
        if (!charInStore) {
            store[count] = str.charAt(i);
            count++;
        }
    }
    System.out.println(str);
    System.out.println(new String(store).trim());


3 commentaires

for (int j = 0; j store et str ont la même longueur. Mais oui à l’idée d’ajouter uniquement s’il n’est pas trouvé. Identique à ma réponse en utilisant contient dans une chaîne plutôt que de faire une boucle dans un tableau.


@ScaryWombat Vous avez raison. votre réponse est plus optimisée.


@Anuradha MERCI frère merci beaucoup! vous avez vu ce que j'essayais de faire. Je remarque maintenant que je stockais au mauvais moment, alors que j'étais à l'intérieur de la boucle parce que j'avais besoin d'utiliser le else de l'instruction if. Utiliser cet indicateur pour garder une trace de l'état de l'instruction if a fait l'affaire. Utiliser également count comme index pour s'opposer au décalage de l'index est plus efficace, merci encore! Maintenant je peux dormir!



1
votes

Vous devez vraiment utiliser la vérification documentaire pour mieux comprendre ce que fait votre code ...

+------+------+--------+--------------------+-------+
|  i   |  j   |  str   |       store        | count |
+------+------+--------+--------------------+-------+
| --- break                                         |
|    3 |    0 | aaabbb | [a, b,  ,  ,  ,  ] |     0 |
|    3 |    1 | aaabbb | [a, b,  ,  ,  ,  ] |     1 |
| --- break                                         |
|    4 |    0 | aaabbb | [a, b,  , b,  ,  ] |     0 |
|    4 |    1 | aaabbb | [a, b,  , b,  ,  ] |     1 |
| --- break                                         |
+------+------+--------+--------------------+-------+

Le problème principal est store [i - count] = str.charAt (i); . Cela ne sera peut-être pas évident tant que vous ne comprenez pas ce qui se passe.

Examinons de plus près le point où les choses commencent à mal tourner ...

+------+------+--------+--------------------+-------+
|  i   |  j   |  str   |       store        | count |
+------+------+--------+--------------------+-------+
|    0 |    0 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
|    0 |    1 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
|    0 |    2 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
|    0 |    3 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
|    0 |    4 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
|    0 |    5 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
|    1 |    0 | aaabbb | [a,  ,  ,  ,  ,  ] |     1 |
| --- break                                         |
|    2 |    0 | aaabbb | [a,  ,  ,  ,  ,  ] |     2 |
| --- break                                         |
|    3 |    0 | aaabbb | [a, b,  ,  ,  ,  ] |     0 |
|    3 |    1 | aaabbb | [a, b,  ,  ,  ,  ] |     1 |
| --- break                                         |
|    4 |    0 | aaabbb | [a, b,  , b,  ,  ] |     0 |
|    4 |    1 | aaabbb | [a, b,  , b,  ,  ] |     1 |
| --- break                                         |
|    5 |    0 | aaabbb | [a, b,  , b, b,  ] |     0 |
|    5 |    1 | aaabbb | [a, b,  , b, b,  ] |     1 |
| --- break                                         |
+------+------+--------+--------------------+-------+

Ok , lorsque i = 4 et j vaut 0

  • str.charAt (i) = b
  • store [j] = a
  • count = 0

Donc, b ! = a , vous utilisez donc store [i - count] , ce qui équivaut à stocker [4 - 0] et stocker str.charAt (i) (ou b ) à ce stade

Et les choses simplement spirale hors de contrôle à partir de là.

Le problème "de base" est que count n'a aucune pertinence entre les boucles. Je remettrais également en question la nécessité de deux boucles de toute façon


2 commentaires

quelle réponse folle ;-)


@ScaryWombat 🤯