Добрый день!
Как пытаюсь решить задачу:
1) Метод readAndGet -> читает байты из потока, преобразует в чары и засовывает в Arraylist, его же и возвращает.
2) Метод countAndSort -> сортирует ArrayList чаров с помощью стандартной Collection.sort, а потом через итерацию считает количетсво повторяемых символов и засовывает их в HashMap, при этом key - это символ char, value - количество повторов. Решение не элегантное, много ненужной перезаписи, но рабочее на первый взгляд.
В чем проблема:
Для теста использую не строку из массива параметров, а просто путь к текстовому файлу на компьютере(текст в файле: asfdsaasfjsoigdafajasfasdjlkajfd). Валидатор ругается на 3 пункт, что не отсортирован по ascii. Так и есть, но дело вот в чем. Если смотреть работу программы, то при добавление в HashMap, а на напомни что добавляется уже отсортированный массив чаров, то есть ключи добавляются друг за другом в правильном порядке. Но почему то буква s, добавляется в map после a, хотя должна быть самой последней. И вот тут я не понимаю, потому что я всегда считал, что метод put проверяет key, и если он есть перезаписывает ячейку, а если нету то добавляет новую в конец.
Где я ошибся ?
public class Solution {
public static void main(String[] args) throws IOException {
String inputFileName = "C:\\Users\\shiro\\OneDrive\\Рабочий стол\\text1.txt";
ArrayList<Character>allChars = readAndGet(inputFileName);
countAndSort(allChars);
}
static ArrayList<Character> readAndGet(String name) throws IOException{
FileInputStream inputStream = new FileInputStream(name);
ArrayList<Character>inputChars = new ArrayList<>();
while (inputStream.available() > 0) {
byte b = (byte)inputStream.read();
char ch = (char) b;
inputChars.add(ch);
}
inputStream.close();
return inputChars;
}
static void countAndSort(ArrayList<Character> characters) {
List<Character>copyList = characters;
Collections.sort(copyList);
Map<Character, Integer> map = new HashMap<>();
for (Character ch : copyList) {
int count = 0;
for (int i = 0; i < copyList.size(); i++) {
if (ch.equals(copyList.get(i))) count++;
}
map.put(ch, count);
}
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}