TreeMap“ё”有什么问题?

时间:2016-06-01 09:27:52

标签: java treemap

任务:尝试从控制台计算单词中的字母数量;

问题:用字母“ё”;

 public static void main(String[] args) throws Exception{
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    String abc = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; //alphabet
    //String abc = "абвгдежзийклмнопрстуфхцчшщъыьэюя"; // without "ё";
    //String abc = "abcdefghijklmnopqrstuvwxyz";// eng

    char[] abcArray = abc.toCharArray();

    ArrayList<Character> alphabet = new ArrayList<Character>();
    for (int i = 0; i < abcArray.length; i++)
    {
        alphabet.add(abcArray[i]);
    }

    //read console
    ArrayList<String> list = new ArrayList<String>();
    for (int i = 0; i < 10; i++)
    {
        String s = reader.readLine();
        if (s.isEmpty()) break;
        list.add(s.toLowerCase());
    }

    Map<Character, Integer> result = new TreeMap<Character, Integer>();

    for (Character x : alphabet){
        int count = 0;
        for (String y : list){
            char[] data = y.toCharArray();
            for (int i = 0; i < data.length; i++) {
                if (x.equals(data[i])){
                    count++;
                }
            }
            result.put(x,count);
        }
    }
    for (Map.Entry<Character, Integer> p : result.entrySet()){
        System.out.println(p.getKey() + " " + p.getValue());
    }
}

输出代码

    абвгдеёжзийклмнопрстуфхцчшщъыьэюя
а 1
б 1
в 1
г 1
д 1
е 1
ж 1
з 1
и 1
й 1
к 1
л 1
м 1
н 1
о 1
п 1
р 1
с 1
т 1
у 1
ф 1
х 1
ц 1
ч 1
ш 1
щ 1
ъ 1
ы 1
ь 1
э 1
ю 1
я 1
ё 1
列表底部的字母“ё”,但它应该在“e”和“ж”之间

in debug mode - in cycle letter "ё" came after "e" and put in map after "e". But when we work with next one letter "ж" letter "ё" move to the bottom of list, and "ж" placed after "e".

如果使用没有“ё”或英文字母的字母 - 所有字母都保持其位置。 我的问题是:为什么会这样?我做错了什么?我一定应该用map。

1 个答案:

答案 0 :(得分:0)

默认情况下,字符按其unicode值排序。您需要提供自定义Comparator以使TreeMap排序不同。最简单的方法是使用1个字符的长字符串作为键并使用Collator

Map<String, Integer> result = new TreeMap<>(Collator.getInstance(new Locale("ru")));
....
result.put(String.valueOf(x), count);

但是,出于性能原因,我会完全避免使用TreeMap并使用简单的int[]作为计数,其索引将与abcArray的索引匹配。这样,您将避免对整数和字符进行装箱和拆箱。