Исключение повторяющихся символов в строке - PullRequest
1 голос
/ 07 февраля 2020

Здравствуйте, я пытаюсь заставить этот кусок работать так, чтобы когда входные данные были строкой, такой как "aaabbbccdddeef", выходные данные были "abcdef". Я знаю, что есть решения, но меня беспокоит, что это не работает, и я не понимаю, почему. Я был бы очень признателен, если бы кто-нибудь помог мне понять, почему этот кусок кода не работает.

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

Ответы [ 4 ]

2 голосов
/ 07 февраля 2020

Другой способ - добавить StringBuilder, если он не существует

    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);
1 голос
/ 07 февраля 2020

Вам действительно нужно использовать кабинетную проверку, чтобы лучше понять, что делает ваш код ...

+------+------+--------+--------------------+-------+
|  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                                         |
+------+------+--------+--------------------+-------+

Основная проблема - store[i - count] = str.charAt(i);. Это может быть неочевидно до тех пор, пока вы не поймете, что происходит.

Давайте более внимательно посмотрим, когда все пойдет не так ...

+------+------+--------+--------------------+-------+
|  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                                         |
+------+------+--------+--------------------+-------+

Хорошо, когда i = 4 и j - это 0

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

Итак, b! = a, поэтому вы используете store[i - count], что соответствует store[4 - 0] и сохраняете str.charAt(i) (или b) в этой точке

И оттуда все просто выходит из-под контроля.

Проблема "basi c" в том, что count не имеет отношения к циклам. В любом случае, я бы тоже поставил под сомнение необходимость двух циклов

1 голос
/ 07 февраля 2020

Нужно сменить логи c внутри второго for l oop. Вы должны повторять store, а не str во втором для l oop. Проверьте мое решение:

    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());
0 голосов
/ 07 февраля 2020

Это может быть простым решением, а также очень сложным решением.

Мое решение, на мой взгляд, очень простое: создайте для l oop, который выполняет итерацию по всей длине строки. Затем используйте индекс + charAt, чтобы определить, повторяется ли строка в течение 1. Создайте новую строку с именем temp. , Затем, если это так, удалите каждый из этих символов, оставив только один. Затем выведите temp

String.indexOf('a');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...