Java中映射特殊字符的问题

时间:2019-01-14 09:39:26

标签: java

我正在尝试使用Java映射数字和特殊字符,但仅映射字母.0到9的数字和特殊符号未映射。此代码的输出是所有带有其分配数字的字母,但没有数字已映射。

import java.util.*; 

class maptable  { 
    public static void main(String args[]) { 
        Map<Character, Integer> hm = new HashMap<Character, Integer>(); 
        hm.put('A', new Integer(1));
        hm.put('B', new Integer(2));
        hm.put('C', new Integer(3));
        hm.put('D', new Integer(4));
        hm.put('E', new Integer(5));
        hm.put('F', new Integer(6));
        hm.put('G', new Integer(7));
        hm.put('H', new Integer(8));
        hm.put('I', new Integer(9));
        hm.put('J', new Integer(10));
        hm.put('K', new Integer(11));
        hm.put('L', new Integer(12));
        hm.put('M', new Integer(13));
        hm.put('N', new Integer(14));
        hm.put('O', new Integer(15));
        hm.put('P', new Integer(16));
        hm.put('Q', new Integer(17));
        hm.put('R', new Integer(18));
        hm.put('S', new Integer(19));
        hm.put('T', new Integer(20));
        hm.put('U', new Integer(21));
        hm.put('V', new Integer(22));
        hm.put('W', new Integer(23));
        hm.put('X', new Integer(24));
        hm.put('Y', new Integer(25));
        hm.put('Z', new Integer(26));
        hm.put('0', new Integer(27));
        hm.put('1', new Integer(28));
        hm.put('2', new Integer(29));
        hm.put('3', new Integer(30));
        hm.put('4', new Integer(31));
        hm.put('5', new Integer(32));
        hm.put('6', new Integer(33));
        hm.put('7', new Integer(34));
        hm.put('8', new Integer(35));
        hm.put('9', new Integer(36));   

        Set<Map.Entry<Character, Integer>> st = hm.entrySet();

        for (Map.Entry<Character, Integer> me : st) { 
            System.out.print(me.getKey() + ":"); 
            System.out.println(me.getValue()); 
        } 
    } 
} 

2 个答案:

答案 0 :(得分:0)

代码有效。

HashMap没有排序,但是由值的hashCode排序。

这可能意味着您首先看到字母或最后一个字母;因为他们的哈希码可能会使用其int值。

一个问题可能是特殊字符。 Java文本以Unicode(Stringchar)完成,但是char仅保留UTF-16。因此,中文Unicode符号可能会转换为两个char(称为<代理代理对)。对于此类用法,最好在类型为int的Java中使用Unicode 代码点

例如,使用印地语或阿拉伯数字时的另一个问题是,编译器必须使用与编辑器相同的编码(请检查IDE),否则.java文件中的字节将以不同的方式解释。如今,国际项目通常使用Unicode UTF-8。

通常,即使其中一些是垃圾代码,通常也希望在上面的代码中至少看到26 + 10行。否则,在非法字节序列(通常使用UTF-8)或不受支持的编码上出现堆栈跟踪异常。

一个问题通常是命令行,它可能使用系统有限的单字节编码。


最后有个小改进:

    hm.put('Z', Integer.valueOf(26));
    hm.put('0', Integer.valueOf(27));

Java缓存一些Integer对象,通常从-128到127。

另外,java可以使用valueOf自动 box 基本类型(= char / int / double / boolean / ...)值。

    hm.put('Z', 26);
    hm.put('0', 27);

实际上,您已经在不知不觉中(?)对字符'Z'进行了此操作:Character.valueOf('Z')

答案 1 :(得分:0)

要简单!

public static int convert(char ch) {
    if (Character.isAlphabetic(ch))
        return Character.toLowerCase(ch) - 'a' + 1;
    if (Character.isDigit(ch))
        return ch - '0' + 27;
    return -1;
}