出于兴趣,我一直致力于一个非常基本的编码器/解码器程序。超级简单的编码,a = 1,b = 2 ......并从那里打印出数字:“1 2 3”。我有那个工作:
final Map<Character, Integer> map;
final String str = "hello world";
map = new HashMap<>();
before Java 7.
map.put('a', 1);
map.put('b', 2);
map.put('c', 3);
map.put('d', 4);
map.put('e', 5);
map.put('f', 6);
map.put('g', 7);
map.put('h', 8);
map.put('i', 9);
map.put('j', 10);
map.put('k', 11);
map.put('l', 12);
map.put('m', 13);
map.put('n', 14);
map.put('o', 15);
map.put('p', 16);
map.put('q', 17);
map.put('r', 18);
map.put('s', 19);
map.put('t', 20);
map.put('u', 21);
map.put('v', 22);
map.put('w', 23);
map.put('x', 24);
map.put('y', 25);
map.put('z', 26);
for(final char c : str.toCharArray())
{
final Integer val;
val = map.get(c);
if(val == null)
{
//error
}
else
{
System.out.print(val + " ");
}
}
System.out.println();
}
现在我正在努力将其转换回来。我想我可以使用各种反向哈希映射来完成它,但我无法让它工作。有什么建议?感谢。
答案 0 :(得分:3)
根本不需要HashMap
这个数据。利用这些字母的字符值都是连续数字这一事实。也就是说,'a'
为97
,'b'
为98
,......,'z'
为122
。
您可以通过减去96
来将字母字符映射到数字。
val = c - 96;
您可以添加96
,然后将其转发回char
,将数字映射回字母。
c = (char) (val + 96);
答案 1 :(得分:1)
从documentation,您可以检查该值是否具有关键的预映像以及它是什么键。实际上,有两个函数可以帮助实现这个目的:
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回true。更正式地,当且仅当此映射包含至少一个到值v的映射时才返回true(value == null?v == null:value.equals(v))。对于Map接口的大多数实现,此操作可能需要地图大小的线性时间
K getKey(对象值)
获取当前映射到指定值的键。
如果地图中未包含该值,则返回null。
答案 2 :(得分:0)
这样的事情应该这样做:
Integer integerToFind = ...;
Character matchingKey = null;
for (Entry<Character, Integer> entry : map.entrySet()) {
if (entry.getValue().equals(integerToFind)) {
matchingKey = entry.getKey();
break;
}
}
这假设没有具有相同值的键。
答案 3 :(得分:0)
我喜欢rgettman的回答,但是如果你想要一个非有序的代码,这种方式可能会更好。
这使用了番石榴的BiMap https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
public class Encoder
{
private BiMap<Character, Integer> mCodeMap = makeCodeMap();
public String encode(String string)
{
string = string.trim();
if (string.length() <= 0) return "";
final StringBuilder results = new StringBuilder();
char c = string.charAt(0);
results.append(mCodeMap.get(c));
for (int i = 1; i < string.length(); ++i) {
c = string.charAt(i);
results.append(' ').append(mCodeMap.get(c));
}
return results.toString();
}
public String decode(String string)
{
string = string.trim();
if (string.length() <= 0) return "";
String[] nums = string.split(" ");
final StringBuilder results = new StringBuilder();
final BiMap<Integer, Character>inverse = mCodeMap.inverse();
for (int i = 0; i < nums.length; ++i) {
final int num = Integer.parseInt(nums[i]);
results.append(inverse.get(num));
}
return results.toString();
}
private static BiMap<Character, Integer> makeCodeMap()
{
BiMap<Character, Integer> codeMap = HashBiMap.create();
codeMap.put('a', 1);
codeMap.put('b', 2);
codeMap.put('c', 3);
codeMap.put('d', 4);
codeMap.put('e', 5);
codeMap.put('f', 6);
codeMap.put('g', 7);
codeMap.put('h', 8);
codeMap.put('i', 9);
codeMap.put('j', 10);
codeMap.put('k', 11);
codeMap.put('l', 12);
codeMap.put('m', 13);
codeMap.put('n', 14);
codeMap.put('o', 15);
codeMap.put('p', 16);
codeMap.put('q', 17);
codeMap.put('r', 18);
codeMap.put('s', 19);
codeMap.put('t', 20);
codeMap.put('u', 21);
codeMap.put('v', 22);
codeMap.put('w', 23);
codeMap.put('x', 24);
codeMap.put('y', 25);
codeMap.put('z', 26);
codeMap.put(' ', 27);
return codeMap;
}
public static void main(String[] args)
{
final String inputString = "this is my test input string";
System.out.println("String = " + inputString);
Encoder encoder = new Encoder();
final String encoded = encoder.encode(inputString);
System.out.println("Encoded = " + encoded);
final String decoded = encoder.decode(encoded);
System.out.println("Decoded = " + decoded);
System.out.println("Correct = " + inputString.equals(decoded));
}
}