【问题标题】:Convert an int to a letter value将 int 转换为字母值
【发布时间】:2015-03-12 21:51:30
【问题描述】:

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

现在我正在研究一种将其转换回来的方法。我想我可以使用某种反向哈希图来做到这一点,但我无法让它工作。有什么建议么?谢谢。

【问题讨论】:

标签: java hashmap encoder decoder


【解决方案1】:

对于这些数据,您根本不需要 HashMap。利用这些字母的字符值都是连续数字这一事实。也就是说,'a'97'b'98,...,'z'122

您可以通过减去96 将字母字符映射到数字。

val = c - 96;

您可以通过添加96 将数字映射回字母,然后将其转换回char

c = (char) (val + 96); 

【讨论】:

  • 如果 OP 选择了不同的编码怎么办?即a = somenumber, b = somenumber+10, c = somenumber - 4等...
  • +1,但我会将96 替换为public static int ENCODING_FLOOR = 'a' - 1
  • @DonLarynx 更随机地混合从字母到数字的映射会使这个解决方案不起作用。但在这个问题上,它们是有序的。
  • @yshavit Nitpick:'a' - 1.
  • @rgettman Nitpick on your nitpick on my nitpick:您的 nitpick 指出了我的 nitpick 上的正确性问题,因此实际上并不是 nitpick。 ;)
【解决方案2】:

documentation,您可以检查该值是否具有键原像以及它是什么键。事实上,有两个功能可以帮助解决这个问题:

boolean containsValue(对象值)

如果此映射将一个或多个键映射到指定值,则返回 true。更正式地说,当且仅当此映射包含至少一个到值 v 的映射时才返回 true,使得 (value==null ? v==null : value.equals(v))。对于 Map 接口的大多数实现,此操作可能需要与地图大小成线性关系的时间

Second method

K getKey(对象值)

获取当前映射到指定值的键。

如果map中不包含该值,则返回null。

【讨论】:

  • 他要求反转编码我的意思是将123转换为abc。你的回答不适合这个问题
  • @emin:我不明白。
  • 好吧,你已经编辑了你的答案,现在它是正确的答案。我试图删除反对票,但为此你应该编辑你的答案,系统不允许删除
【解决方案3】:

应该这样做:

Integer integerToFind = ...;
Character matchingKey = null;
for (Entry<Character, Integer> entry : map.entrySet()) {
    if (entry.getValue().equals(integerToFind)) {
        matchingKey = entry.getKey();
        break;
    }
}

这假设没有具有相同值的键。

【讨论】:

    【解决方案4】:

    我喜欢 rgettman 的回答,但如果你想要一个无序的代码,这种方式可能会更好。

    这使用 Guava 的 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));
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 2021-11-04
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多