Java for循环与char数组不起作用

时间:2018-09-17 10:07:03

标签: java arrays for-loop multidimensional-array

我在这里遇到了循环问题,我正在研究一个脚本,该脚本将接收字符串“ 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'}};

首先,我将String传递给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];
    }
}

然后我创建一个名为'second'的String的新实例,以将数组转换为String

String second = new String(tab);

然后我将String变成了double

double finalC = Double.parseDouble(second);

此循环存在问题,如果String地穴为“ abab”,则循环将按预期方式返回0101,但是如果String包含第一个数组中“ a”或“ b”之后的任何字母二维数组,例如字符串“ geij”,程序将简单地返回“ geij”。 我不明白为什么该程序没有比b更进一步,并且开始给我带来麻烦。如果有人有想法,我将不胜感激!

下面是字符串“ abcd”循环后的选项卡数组内部的示例:

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

4 个答案:

答案 0 :(得分:2)

Kevin Cruijssen 解决了您的问题,但您可以做更多:

使用 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());

答案 1 :(得分:0)

问题出在您的内部循环中: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,导致您现在遇到的问题。

答案 2 :(得分:0)

twoD数组的长度为2。第二个循环应从z = 0迭代到twoD[0].length

尝试有意义地命名变量,这样将更容易找到这样的错误。还要检查foreach循环,这样您就不必担心索引。 Java Maps可能更适合将字符映射到数字。

答案 3 :(得分:0)

由于在您的情况下,字符似乎与它们的int值一起递增,因此根本不需要映射。您可以将字符转换为int,然后减去a的int值。这与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());