2016-06-01 6 views
1

タスク:コンソールから単語の文字数を計算してみます。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".

の間でなければなりません"ё"または英語アルファベット - すべての文字がその位置を保持します。 私の質問です:なぜそれが起こったのですか?私は何か間違っている?私は必然的に地図を使うべきだった。

+1

スクリーンショットへのリンクではなく、質問自体に必要な情報を含めてください。 – khelwood

答えて

0

デフォルトでは、文字はユニコード値でソートされます。 Comparatorを入力してTreeMapのソート方法を変更する必要があります。最も簡単な方法は、キーとして1文字の長い文字列を使用してCollatorを使用することです:

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

ただし、パフォーマンス上の理由から、私は完全にTreeMapを使用して回避するとカウントのための簡単なint[]を使用し、その指標のそれと一致しますabcArray。この方法で、あなたはボクシングと整数と文字のunboxingを避けることができます。

関連する問題