Это четвертая статья из моих попыток следовать за Стивеном Гриндер Курс Udemy на трех разных языках.
Первый Я цитирую сегодняшний вопрос:
— Указания, заданные в строке, возвращают символ, который чаще всего используется в строке. — Примеры MAXCHAR(“abcccccccd”) Maxchar(“apple 1231111”)
язык JavaScript:
function maxChar(str) {
const charMap = {};
let max = 0;
let maxChar = '';
for (let char of str) {
if (charMap[char]) {
charMap[char]++
} else {
charMap[char] = 1;
}
}
for (let char in charMap) {
if (charMap[char] > max) {
max = charMap[char];
maxChar = char;
}
}
return maxChar;
}
Стивен переписывает первый цикл for как:
for (let char of str) {
charMap[char] = charMap[char] + 1 || 1;
}
Это возможно, потому что anObject['несуществуюЩий ключ'] возвращает не определено , не определено + 1 возвращает NaN , что является ложным.
Питон:
def max_char(str):
char_map = {}
max = 0
max_char = ''
for char in str:
char_map.setdefault(char, 0)
char_map[char] += 1
for char in char_map:
if char_map[char] > max:
max = char_map[char]
max_char = char
return max_char
В Python вы не можете просто попробовать char_map[char] , как в JS, потому что это приведет к ошибке ключа, если ключ еще не существует.
Более кратко:
def max_char(str):
char_map = {}
for char in str:
char_map.setdefault(char, 0)
char_map[char] += 1
return max(char_map, key=char_map.get)
Источник: https://stackoverflow.com/questions/268272/getting-key-with-maximum-value-in-dictionary max(char_map,.get) совпадает с max(char_map.keys(),.get) . ключ=char_map.get необходим для поиска пары кортежей (ключ, значение) в словаре, чье значение является наибольшим. max({'a': 2, 'b': 1}) возвращает ‘b’.
Ява:
import java.util.HashMap;
import java.util.Map;
public static char maxChar2(String str) {
Map charMap = new HashMap<>();
for (char chr : str.toCharArray()) {
Integer chrCount = charMap.get(chr);
if (chrCount == null) {
chrCount = 0;
}
charMap.put(chr, chrCount + 1);
}
int max = 0;
char maxChar = '\0';
for (Map.Entry entry : charMap.entrySet()) {
int value = entry.getValue();
if (value > max) {
max = value;
maxChar = entry.getKey();
}
}
return maxChar;
}
Использование потока:
public static char maxChar(String str) {
Map charMap = str.chars()
.mapToObj(i -> (char) i)
.collect(Collectors.groupingBy(
c -> c, Collectors.counting()));
return charMap.entrySet().stream()
.collect(Collectors.groupingBy(
Map.Entry::getValue,
TreeMap::new,
Collectors.mapping(
Map.Entry::getKey, Collectors.toList())))
.lastEntry()
.getValue()
.get(0);
}
Оператор возврата может быть упрощен:
return charMap.entrySet().stream()
.max(Map.Entry.comparingByValue())
.get()
.getKey();
Список литературы: https://codereview.stackexchange.com/questions/133058/print-max-occurring-character-in-a-string https://stackoverflow.com/questions/48280361/how-to-count-occurrences-for-each-value-in-multimap-java https://stackoverflow.com/questions/42060294/using-java8-stream-to-find-the-highest-values-from-map
Оригинал: “https://dev.to/tommy3/learning-algorithms-with-js-python-and-java-4-maxchar-1eo2”