Определение n популярных символов в файле
Интересует только \public List getTopNPopularSymbols (int n)\. Всю голову сломал. Остальной код оставлю, вдруг пригодится. Естественно, вывод через List.
public class FileAnalyserImpl implements FileAnalyser {
File file = new File("hello.txt");
Map<Character, Integer> localMap;
@Override
public String getFileName() {
String name = file.getName();
return name;
}
@Override
public int getRowsCount () throws FileNotFoundException {
Scanner scanner = new Scanner(file);
int lines = 0;
while (scanner.hasNextLine()) {
lines++;
}
return lines;
}
@Override
public int getLettersCount () throws IOException {
InputStreamReader read = new InputStreamReader(new FileInputStream(file));
BufferedReader in = new BufferedReader(read);
String str;
int totalSymbols = 0;
while ((str = in.readLine()) != null) {
totalSymbols += str.length();
}
in.close();
return totalSymbols;
}
@Override
public Map<Character, Integer> getSymbolsStatistics () throws IOException {
Map<Character, Integer> characters = new TreeMap<Character, Integer>();
Scanner scanner = null;
try {
scanner = new Scanner(file,"utf-8");
while (scanner.hasNext()) {
char[] line = scanner.nextLine().toLowerCase().toCharArray();
for (Character character : line) {
if (Character.isLetter(character)){
if (characters.containsKey(character)) {
characters.put(character, characters.get(character) + 1);
} else {
characters.put(character, 1);
}
}
}
}
} finally {
if (scanner != null){
scanner.close();
}
}
localMap = characters;
return characters;
}
@Override
public List<Character> getTopNPopularSymbols (int n){
int j = 0;
while (j < n) {
}
return null;
}
Ответы (1 шт):
Автор решения: Alex Rudenko
→ Ссылка
Берете поток entrySet от карты частот символов, сортируете его по убыванию частот, оставляете n символов и возвращаете список символов:
public List<Character> getTopNPopularSymbols (int n) {
if (localMap == null) {
return Collections.emptyList(); // лучше возвращать пустой список
}
return localMap.entrySet()
.stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.limit(n)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}