我需要一些帮助来改进我的代码,并想知道我是否有更好的方法来执行以下操作:
StringBuilder buf = new StringBuilder(node.length() + 8);
for (int i=0, n=node.length(); i<n; i++) {
char c = node.charAt(i);
String hexadecimal = "";
switch (c) {
case '"': hexadecimal = "\\22"; break;
case '&': hexadecimal = "\\26"; break;
case '\'': hexadecimal = "\\27"; break;
case '/': hexadecimal = "\\2f"; break;
case ':': hexadecimal = "\\3a"; break;
case '<': hexadecimal = "\\3c"; break;
case '>': hexadecimal = "\\3e"; break;
case '@': hexadecimal ="\\40"; break;
case '\\':hexadecimal = "\\5c"; break;
default: {
if (Character.isWhitespace(c)) {
hexadecimal = "\\20";
}else if(c > 127){
hexadecimal = "\\" + Integer.toHexString(c) + "\\";
}
else {
hexadecimal = String.valueOf(c);
}
}
}
buf.append(hexadecimal);
}
return buf.toString();我不喜欢switch语句,它只是根据情况设置变量(hexadecimal)。我觉得有更好的方法来做到这一点,比如使用散列映射。我需要代码是灵活的,这样添加新的字符和设置十六进制是容易的。
发布于 2012-07-06 11:32:07
哈希映射通常是避免开关语句的一个好主意。它可以与战略和抽象工厂模式( 就是这样 作为 在……里面 这些 示例 )结合使用。
然而,策略模式对于您的问题来说是过分的。简单的hashmap如下所示
Map<Character, String> hexMap = new HashMap<Character, String>();
hexMap.put('\"', "\\22");
hexMap.put('\n', "\\20");
// puts more stuff in map...
for (int i=0, n=node.length(); i<n; i++) {
char c = node.charAt(i);
buf.append(hexMap.get(c));
}但是快速搜索"java字符到十六进制“会产生这些 结果。我最喜欢的是
StringBuilder buf = new StringBuilder(node.length() + 8);
for (int i = 0; i < node.length(); ++i) {
char ch = node.charAt(i);
buf.append(String.format("\\%1$x", (ch & 0xFFFF)));
}
return buf.toString();编辑:忘了说,不要使用神奇的数字。我不知道8在你的程序中在做什么,我也不需要耐心尝试推断。
https://codereview.stackexchange.com/questions/13389
复制相似问题