2016-06-01 2 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을 다르게 정렬해야합니다.

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

그러나, 성능상의 이유로, 나는 모두 TreeMap을 사용하지 않는 것이 누구의 인덱스의 것과 일치 수, 대한 간단한 int[]를 사용 간단한 방법은 키로 한 문자 긴 문자열을 사용하고 Collator을 사용하는 것입니다 abcArray. 이런 식으로, 당신은 정수와 문자의 복싱과 언 박싱을 피할 수 있습니다.