我正在实施单字母替换算法。键和值存储在HashMap中,并使用StringBuffer类的变量作为输入字符串的参数:
public class Mono {
private StringBuffer source;
private Map<String, String> alphabet;
public Mono(String source) {
this.source = new StringBuffer(source);
alphabet = new HashMap<>();
alphabet.put("a", "f");
alphabet.put( //... etc.
}
public StringBuffer startEncrypt() {
for (int i = 0; i < source.length(); i++) {
for (Map.Entry entry : alphabet.entrySet()) {
if (entry.getKey().toString().equals(source.charAt(i))) {
source.setCharAt(i, entry.getValue().toString());
}
}
}
return source;
}
}
我在这里遇到了将字符串转换为字符的问题:source.setCharAt(i, entry.getValue().toString());
那么,我的问题是如何做到这一点?或者是否有另一种更换角色的更好方法?
感谢。
答案 0 :(得分:3)
你可以使用charAt(0)
获取字符串的第一个字符......就像你已经为你的密钥做的那样。请注意,如果您使用参数化Map.Entry
而不是原始类型,则您不需要toString
调用:
for (Map.Entry<String, String> entry : alphabet.entrySet()) {
// TODO: Should this be source.charAt(i)?
if (entry.getKey().equals(source.charAt(0))) {
source.setCharAt(i, entry.getValue().charAt(0));
}
}
那就是说,如果你的所有字符串都只是一个字符,为什么不使用Map<Character, Character>
?此外,迭代所有地图中的条目效率低下,几乎肯定不您想要做什么。我怀疑你实际上想要类似的东西:
private final Map<Character, Character> mappings;
public String substitute(String input) {
char[] chars = input.toCharArray();
for (int i = 0; < chars.length; i++) {
Character sub = mapping.get(chars[i]);
if (sub != null) {
chars[i] = sub;
}
}
return new String(chars);
}
答案 1 :(得分:1)
尝试:
entry.getValue().toString().chartAt(0)
答案 2 :(得分:0)
不确定是否符合您的需求,但我会这样:
public class Mono {
private StringBuffer source;
private Map<Character, Character> alphabet;
public Mono(String source) {
this.source = new StringBuffer(source);
alphabet = new HashMap<>();
alphabet.put('a', 'f');
alphabet.put( //... etc.
}
public StringBuffer startEncrypt() {
for (int i = 0; i < source.length(); i++) {
for (Character key : alphabet.keySet()) {
if (source.charAt(0) == key) {
source.setCharAt(i, alphabet.get(key));
}
}
}
return source;
}
}
它更具可读性,您不需要任何类型转换。更简单更好:)