任务:尝试从控制台计算单词中的字母数量;
问题:用字母“ё”;
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”和“ж”之间
如果使用没有“ё”或英文字母的字母 - 所有字母都保持其位置。 我的问题是:为什么会这样?我做错了什么?我一定应该用map。
答案 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
的索引匹配。这样,您将避免对整数和字符进行装箱和拆箱。