3 回答

TA贡献1744条经验 获得超4个赞
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());

TA贡献1818条经验 获得超11个赞
你的 twoD 数组的长度是 2。你的第二个循环应该从z = 0
到迭代twoD[0].length
。
尝试有意义地命名您的变量,以便更容易找到这样的错误。还要检查 foreach 循环,这样您就不必担心索引。Java Maps 可以更好地将字符映射到数字。

TA贡献1853条经验 获得超6个赞
问题出在您的内部循环中: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,导致您现在遇到的问题。
添加回答
举报