[英]How to sort a list of strings based on Character Frequency
我有一个字符串列表,我需要根据每个单词中 A 的频率对它们进行排序。 如果 A 相等,则比较 B,依此类推,直到 Z。假设课程列表中没有字谜。
示例: [Banana, Isle, Best, Barb]
排序: [Banana, Barb, Best, Isle]
您正在对多个标准进行排序,26 个标准,看起来像
# for banana, occurence of each char in alphabet
[3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
所以建立那个
from string import ascii_lowercase
def sorter(word: str):
word_low = word.lower()
return [word_low.count(c) for c in ascii_lowercase]
values = ["Banana", "Isle", "Best", "Barb"]
values = sorted(values, key=sorter, reverse=True)
print(values)
初始数组中的单词可以使用比较器对从给定单词的排序字符数组构建的转换字符串进行排序:
public static String convert(String s) {
char[] c = s.toLowerCase().toCharArray();
Arrays.sort(c);
return new String(c);
}
String[] data = {"Banana", "Isle", "Best", "Barb", "Abracadabra", "aardvark", "Barnabie"};
Arrays.sort(data, Comparator.comparing(MyClass::convert));
System.out.println(Arrays.toString(data));
输出:
[Abracadabra, Banana, aardvark, Barnabie, Barb, Best, Isle]
这是一种方法。 首先建立一个比较器。
a
计数)。thenComparing
附加下一个计数的每个可能位置Comparator<int[]> comp = Comparator.comparing(a -> a[0]);
for (int i = 1; i < 26; i++) {
final int g = i;
comp = comp.thenComparing(a -> a[g]);
}
comp = comp.reversed();
现在定义一个Function
来获取每个单词的字母频率计数。 此函数接受一个单词并返回一个包含 26 个值的 int 数组,用于每个单词中字母az
的计数。 计数不区分大小写。
Function<String, int[]> frequency = (word) -> {
int[] counts = new int[26];
for (char ch : word.toCharArray()) {
counts[Character.toLowerCase(ch)
- 'a']++;
}
return counts;
};
现在是排序的时候了。 把它们放在一起:
Entry
,其中key
是单词, value
是为该单词计算的频率计数。Entry#value
进行排序。List<String> words = List.of("Banana", "Isle", "Best", "baha", "baby","bad", "animal", "zoo", "elephant");
List<String> result = words.stream().map(
word -> new AbstractMap.SimpleEntry<String, int[]>(
word, frequency.apply(word)))
.sorted(Entry.comparingByValue(comp))
.map(Entry::getKey).toList();
System.out.println(result);
印刷
[Banana, baha, animal, baby, bad, elephant, Best, Isle, zoo]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.