将int转换为字母值

时间:2015-03-12 21:51:30

标签: java hashmap encoder decoder

出于兴趣,我一直致力于一个非常基本的编码器/解码器程序。超级简单的编码,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();
}

现在我正在努力将其转换回来。我想我可以使用各种反向哈希映射来完成它,但我无法让它工作。有什么建议?感谢。

4 个答案:

答案 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接口的大多数实现,此操作可能需要地图大小的线性时间

Second method

  

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));
    }

}