首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有字符数组的Java for循环不起作用

带有字符数组的Java for循环不起作用
EN

Stack Overflow用户
提问于 2018-09-17 18:07:03
回答 4查看 147关注 0票数 0

我在这里遇到了一个循环问题,我正在编写一个脚本,这个脚本将接收字符串"geij“或"abab”,并必须将其转换为双精度值,如"6478“或"0101”。多亏了一个二维数组,我完成了从字母到数字的转换:

代码语言:javascript
复制
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数组:

代码语言:javascript
复制
char tab[] = crypt.toCharArray();

然后我使用一个循环将字母转换为数字:

代码语言:javascript
复制
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实例,将数组转换为字符串

代码语言:javascript
复制
String second = new String(tab);

我把这个字符串变成了双精度

代码语言:javascript
复制
double finalC = Double.parseDouble(second);

问题出在这个循环中,如果字符串crypt是"abab",则循环将按照预期返回0101,但是如果字符串包含二维数组第一个数组中"a“或"b”之后的任何字母,例如字符串"geij“,则程序将简单地返回"geij”。我不明白为什么这个程序不能比b走得更远,而且它开始让我有个书呆子了。如果有人有什么想法,我将不胜感激!

下面是字符串"abcd“循环之后的tab数组内部的示例:

代码语言:javascript
复制
Indice : 0 value: 0
Indice : 1 value: 1
Indice : 2 value: c
Indice : 3 value: d
EN

回答 4

Stack Overflow用户

发布于 2018-09-17 18:42:56

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

使用HashMap解决此问题。现在,您的算法时间复杂度是O(n*m) (n基字符串长度,m-表中字母的数量),因为您必须迭代每个字母的整个字母数组。

使用HashMap可以在O(1)中找到正确的字母。快得多。所以现在你的算法具有O(n)时间复杂度。

简单的例子:

代码语言:javascript
复制
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());
票数 3
EN

Stack Overflow用户

发布于 2018-09-17 18:14:20

问题出在内部循环中:twoD.length是2,因为twoD包含两个内部字符数组。

您应该改用twoD[0].length

代码语言:javascript
复制
for(int c=0; c<tab.length; c++) {
  for(int z=0; z<twoD[0].length; z++) {
    ...

但是,由于您使用的是全部十位数字,因此使用十位数字可能更好:

代码语言:javascript
复制
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,这会导致您现在遇到的问题。

票数 0
EN

Stack Overflow用户

发布于 2018-09-17 18:32:12

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

尝试对变量进行有意义的命名,这样就更容易找到像这样的bug。另外,查看foreach循环,这样您就不必担心索引了。Java Maps可以更好地将字符映射到数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52365298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档