繁体   English   中英

如何根据字符频率对字符串列表进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM