我正在学习Java,作为一个项目,我正在尝试创建一个程序,使用HashMap
接受用户的string
,然后返回相应的(伪拼音)值准加密的String
。
当String
的长度只有1 character
时,我才能使用此功能,但我尝试处理完整句子的尝试失败了。
在先前的SO问题中,这被标记为重复(我删除了问题),但是先前的相关解决方案:
for (int i = 0; i < args.length(); i++){
char c = args.charAt(i);
s += lookup.get(c);
s += " ";
}
实际上并没有解决我的问题。
我使用for
循环表示为以前发布的解决方案的最佳结果是返回一个字符串,为用户输入的每个字符打印null
。例如,hello
变为null 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);
}
}
如果有用,我还可以为包含.java
功能的main
文件提供相应的代码。
答案 0 :(得分:4)
如果您的地图以char
为关键字,则无法使用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 += " ";
}
或者这个,更有礼貌:
WALSender
答案 1 :(得分:3)
问题是您String
包含char
,但您正尝试使用Character
进行查找(装箱到for (int i = 0; i < args.length(); i++){
String c = Character.toString(args.charAt(i));
s += lookup.get(c);
s += " ";
}
s)。
用
替换你的循环char
这会将String
转换为"s"
,这样它就会找到您放入的相同类型的对象。请记住,'s'
与CLIENTID1 YYYY-MM-DD connect
CLIENTID2 YYYY-MM-DD connect
CLIENTID3 YYYY-MM-DD connect
CLIENTID1 YYYY-MM-DD disconnect
不同}
答案 2 :(得分:2)
它正在返回null
,因为您已将地图声明为HashMap<String, String> lookup
,String
为您的密钥的类型,然后您尝试使用一个char
char c = args.charAt(i);
s += lookup.get(c);
这就是它返回null
的原因。
所以请改用:
char c = args.charAt(i);
s += lookup.get(new String(c));
答案 3 :(得分:2)
您的方法存在的问题是地图中的键的类型为String
,而您用于查找的键的类型为char
。
您可以通过两种方式解决它:
char
转换为String
- 例如,将其与""
连接,调用toString
或使用valueOf
方法,或HashMap<Character,String>
。第一种方法(将char
转换为String
稍微浪费一些,因为它会产生大量丢失的单字符字符串。虽然char
访问需要装箱,{{ 1}} class interns 您的代码正在使用的所有字符,并重复使用相同的对象进行装箱转换。这样可以消除浪费。
第二种方法更清洁,它可以让你保持查找不变。您需要更改的是插入:
Character
其他所有内容将继续有效,无需进行其他更改。