从 HashMap<String, String> 中检索字符串的每个字符的值将返回 NULL

Retreiving values from HashMap<String, String> for each character of a string returns NULL

提问人:Hack-R 提问时间:10/15/2015 最后编辑:Jordi CastillaHack-R 更新时间:10/15/2015 访问量:132

问:

我正在学习Java,作为一个项目,我正在尝试制作一个程序,该程序使用a从用户那里接受a,然后将相应的(伪拼音)值作为准加密返回。HashMapstringString

当长度只有 1 时,我让它起作用,但我多次尝试处理完整句子都失败了。Stringcharacter

在之前的 SO 问题中,这被标记为重复(我删除了该问题),但之前的相关解决方案:

 for (int i = 0; i < args.length(); i++){
     char c = args.charAt(i);        
     s += lookup.get(c);
     s += " "; 
 }

实际上并不能解决我的问题。

我能够使用先前发布的解决方案指示的循环获得的最佳结果是返回一个字符串,该字符串为用户输入的每个字符打印。例如,变为 .fornullhellonull null null null null

下面是代码的相关部分 ():Encrypt2Pinyin.java

package pinyincrypto;
import java.util.*;

public class Encrypt2Pinyin {

public static String e2p(String args){
HashMap<String, String> lookup = new HashMap<>();
lookup.put("a", "xuduo");
lookup.put("b", "bai");
lookup.put("c", "cai");
lookup.put("d", "dai");
lookup.put("e", "tao");
lookup.put("f", "nao");
lookup.put("g", "lao");
lookup.put("h", "zheng");
lookup.put("i", "ceng");
lookup.put("j", "sheng");
lookup.put("k", "peng");
lookup.put("l", "che");
lookup.put("m", "shui");
lookup.put("n", "ge");
lookup.put("o", "zhi");
lookup.put("p", "nu");
lookup.put("q", "ren");
lookup.put("r", "nan");
lookup.put("s", "hai");
lookup.put("t", "xihuan");
lookup.put("u", "wo");
lookup.put("v", "wu");
lookup.put("w", "chi");
lookup.put("x", "niu");
lookup.put("y", "duo");
lookup.put("z", "yunxing");
lookup.put("A", "Xuduo");
lookup.put("B", "Bai");
lookup.put("C", "Cai");
lookup.put("D", "Dai");
lookup.put("E", "Tao");
lookup.put("F", "Nao");
lookup.put("G", "Lao");
lookup.put("H", "Zheng");
lookup.put("I", "Ceng");
lookup.put("J", "Sheng");
lookup.put("K", "Peng");
lookup.put("L", "Che");
lookup.put("M", "Shui");
lookup.put("N", "Ge");
lookup.put("O", "Zhi");
lookup.put("P", "Nu");
lookup.put("Q", "Ren");
lookup.put("R", "Nan");
lookup.put("S", "Hai");
lookup.put("T", "Xihuan");
lookup.put("U", "Wo");
lookup.put("V", "Wu");
lookup.put("W", "Chi");
lookup.put("X", "Niu");
lookup.put("Y", "Duo");
lookup.put("Z", "Yunxing");
lookup.put(" ", " ");
lookup.put(".", "?");
lookup.put("!", ".");
lookup.put("?", "!");
lookup.put("$", "%");
lookup.put("%", "$");
lookup.put("@", "&");
lookup.put("&", "@");
lookup.put("#", "*");
lookup.put("*", "#");
lookup.put("^", "]");
lookup.put("(", ")");
lookup.put(")", "(");
lookup.put("-", "-");
lookup.put("=", "+");
lookup.put("+", "=");
lookup.put("\n", "\n");
lookup.put(" ", " ");
//Vector vec = new Vector();
//vec.add(args);
//Iterator<HashMap<K, V>> itr = lookup.values().iterator();
//String[] vec = args;
//Vector<String> vector = null;
//while (itr.hasNext())
//{
//vector=(vec)itr.next();
//  }

//String[] str   = null;
//s = args.split("(?!^)") ;

String s   = " ";
//String str = args.trim();
for (int i = 0; i < args.length(); i++){
    char c = args.charAt(i);        
        s += lookup.get(c);
        s += " ";
}
//return(lookup.get(args.charAt(1))); // just a test -- still returns null
return(s);
}
}

如果它有用,我还可以为包含我的函数的文件提供相应的代码。.javamain

Java 字符串 哈希图

评论

2赞 Mick Mnemonic 10/15/2015
char和数据类型在 Java 中是不同的。您似乎正在尝试通过传入 ..Stringchar

答:

4赞 Jordi Castilla 10/15/2015 #1

如果您的地图具有 as 键,则不能使用Stringchar

char c = args.charAt(i);  
s += lookup.get(c);      // you are giving char as key, what is not valid!!!

使用此解决方法:

for (int i = 0; i < args.length(); i++){
    char c = args.charAt(i);        
    s += lookup.get(c+"");
    //                 ↑ ugly but converts char to String
    s += " ";
}

或者这个,更礼貌:

for (int i = 0; i < args.length(); i++){
    String c = Character.toString(args.charAt(i));
    s += lookup.get(c);
    s += " ";
}

评论

4赞 Kayaman 10/15/2015
为什么不改用呢?String.valueOf(char);
2赞 Jordi Castilla 10/15/2015
@Kayaman更新的答案,只是因为OP说:我正在学习Javachar+""
0赞 Hack-R 10/15/2015
非常感谢您和@resueman,我已经对这两个答案投了赞成票,一旦有足够的时间,我会将其标记为解决方案
2赞 Abubakkar 10/15/2015 #2

它之所以返回,是因为您已将映射声明为 with 作为密钥的类型,然后您尝试使用nullHashMap<String, String> lookupStringchar

char c = args.charAt(i);        
s += lookup.get(c);

这就是它返回的原因.null

所以用这个代替:

 char c = args.charAt(i);        
 s += lookup.get(new String(c));

评论

1赞 Hack-R 10/15/2015
另一个好的解决方案。其他人先回答,但我可以给你一个+1,谢谢!
2赞 Sergey Kalinichenko 10/15/2015 #3

方法的问题在于映射中的键类型为 ,而用于查找的键类型为 。Stringchar

您可以通过两种方式解决它:

  • 将 转换为 - 例如,将其与 、 calling 或 using 方法连接,或者charString""toStringvalueOf
  • 将映射更改为 。HashMap<Character,String>

第一种方法(转换为稍微浪费一些,因为它会产生大量丢弃的单字符字符串。尽管访问 by 需要装箱,但类实习代码正在使用的所有字符,并重用同一对象进行装箱转换。这样就消除了浪费。charStringcharCharacter

第二种方法要干净得多,它可以让您保持查找不变。您需要更改的只是插入:

Map<Character,String> lookup = new HashMap<>();
lookup.put('a', "xuduo");
lookup.put('b', "bai");
lookup.put('c', "cai");
...

其他一切都将继续工作,无需其他更改。