Java для цикла с диз-функцией массивов символов - PullRequest
0 голосов
/ 17 сентября 2018

Я застрял здесь с проблемой цикла, я работаю над сценарием, который получит, скажем, String "geij" или "abab" и должен будет превратить его в двойное число, например "6478" или "0101".».Я делаю преобразование из буквы в число благодаря двумерному массиву:

String crypt = "geij"; 

char twoD[][] = {{'a','b','c','d','e','f','g','h','i','j'}, {'0','1','2','3','4','5','6','7','8','9'}};

Сначала я передаю строку в массив char:

char tab[] = crypt.toCharArray();

Затем я использую цикл дляпреобразовать из буквы в число:

for(int c=0;c<tab.length;c++) {
    for(int z=0;z<twoD.length;z++) {
        if(tab[c] == twoD[0][z]) {          
            tab[c] = twoD[1][z];
    }
}

Затем я создаю новый экземпляр String с именем 'second', чтобы превратить массив в строку

String second = new String(tab);

И я превратил эту строку вdouble

double finalC = Double.parseDouble(second);

Проблема в этом цикле. Если крипта String имеет значение «abab», цикл вернет 0101, как и положено, но если строка содержит любую букву после «a» или «b "из первого массива двумерного массива, как, например, строка" geij ", программа просто вернет" geij ".Я не понимаю, почему программа не идет дальше, чем b, и она начинает давать мне головокружение.Если у кого-то есть идея, я буду благодарен!

Вот пример внутренней части массива tab после цикла для строки "abcd":

Indice : 0 value: 0
Indice : 1 value: 1
Indice : 2 value: c
Indice : 3 value: d

Ответы [ 4 ]

0 голосов
/ 17 сентября 2018

Поскольку в вашем случае кажется, что символы увеличиваются вместе со своими значениями int, вам вообще не нужна карта.Вы можете привести символ к int, а затем вычесть значение int a.Это небольшое отклонение ответа B_Osipiuk :

String toEncode = "abcd";
char[] chars = toEncode.toCharArray();
StringBuilder sb = new StringBuilder();
for(char c : chars){
    int newInt = c - 'a';
    if (newInt < 0 || newInt > ('j'-'a')) {
        continue; //or do something else, e.g throw exception;
    }
    sb.append(newInt);
}

System.out.println(sb.toString());
0 голосов
/ 17 сентября 2018

Длина вашего двумерного массива равна 2. Ваш второй цикл должен повторяться от z = 0 до twoD[0].length.

Попробуйте осмысленно назвать свои переменные, чтобы было легче находить подобные ошибки. Также проверьте циклы foreach, чтобы вам не пришлось беспокоиться об индексах. Java Maps может быть лучше для отображения символов на цифры.

0 голосов
/ 17 сентября 2018

Кевин Круйссен решит вашу проблему, но вы можете сделать больше:

Используйте HashMap для решения этой проблемы. На данный момент сложность времени вашего алгоритма составляет O (n * m) (длина n-базовой строки, m - количество букв в таблице), потому что вы должны перебирать весь массив букв для каждой буквы.

Используя HashMap, вы можете найти правильную букву в O (1). Намного быстрее Итак, теперь ваш алгоритм имеет O (n) сложность времени.

Простой пример:

Map<Character, Integer> encoding = new HashMap<>();
encoding.put('a', 0);
encoding.put('b', 1);
encoding.put('c', 2);
encoding.put('d', 3);

String toEncode = "abcd";
char[] chars = toEncode.toCharArray();
StringBuilder sb = new StringBuilder();
for(char c : chars){
    int newInt = encoding.getOrDefault(c, -5); //-5 is just a flag that there is no char to encode
    if(newInt == -5){
       continue; //or do something else, e.g throw exception;
    }
    sb.append(newInt);
}

System.out.println(sb.toString());
//Parse double if you want, but remember that what *Nikolas* said in the comments under your post.
//Double.parseDouble(sb.toString());
0 голосов
/ 17 сентября 2018

Проблема в вашем внутреннем цикле: twoD.length равно 2, потому что twoD содержит два ваших внутренних массива символов.

Вы должны использовать twoD[0].length вместо:

for(int c=0; c<tab.length; c++) {
  for(int z=0; z<twoD[0].length; z++) {
    ...

Однако, поскольку вы используете все десять цифр, возможно, лучше использовать это вместо:

char twoD[][] = {{'a','b','c','d','e','f','g','h','i','j'}, {'0','1','2','3','4','5','6','7','8','9'}};
int amountOfDigitsUsed = 10; // Equal to `twoD[0].length` or `twoD[1].length`.

for(int c=0; c<tab.length; c++) {
  for(int z=0; z<amountOfDigitsUsed; z++) {
    ...

Независимо от того, используете ли вы жестко запрограммированное преобразование twoD и amountOfDigits использовали или нет. В вашей текущей реализации twoD.length равен 2, что вызывает проблемы, которые у вас есть прямо сейчас.

...