gpt4 book ai didi

Java 8 流 : Count the occurrence of elements(List list1) from list of text data(List list2)

转载 作者:行者123 更新时间:2023-12-01 11:55:36 26 4
gpt4 key购买 nike

输入 :

List<String> elements= new ArrayList<>();
elements.add("Oranges");
elements.add("Figs");
elements.add("Mangoes");
elements.add("Apple");

List<String> listofComments = new ArrayList<>();
listofComments.add("Apples are better than Oranges");
listofComments.add("I love Mangoes and Oranges");
listofComments.add("I don't know like Figs. Mangoes are my favorites");
listofComments.add("I love Mangoes and Apples");

输出:[芒果、苹果、橙子、无花果] -> 输出必须按元素出现次数的降序排列。如果元素出现等于没有。次,那么它们必须按字母顺序排列。

我是 Java 8 的新手,遇到了这个问题。我尝试部分解决它;我无法排序。谁能帮我写出更好的代码?

我的一段代码:
Function<String, Map<String, Long>> function = f -> {
Long count = listofComments.stream()
.filter(e -> e.toLowerCase().contains(f.toLowerCase())).count();
Map<String, Long> map = new HashMap<>(); //creates map for every element. Is it right?
map.put(f, count);
return map;
};

elements.stream().sorted().map(function).forEach(e-> System.out.print(e));

输出:{Apple=2}{Figs=1}{Mangoes=3}{Oranges=2}

最佳答案

在现实生活场景中,您必须考虑将任意数量的匹配操作应用于任意数量的评论,当数量增长时可能会变得非常昂贵,因此值得做一些准备:

Map<String,Predicate<String>> filters = elements.stream()
.sorted(String.CASE_INSENSITIVE_ORDER)
.map(s -> Pattern.compile(s, Pattern.LITERAL|Pattern.CASE_INSENSITIVE))
.collect(Collectors.toMap(Pattern::pattern, Pattern::asPredicate,
(a,b) -> { throw new AssertionError("duplicates"); }, LinkedHashMap::new));

Predicate 即使不进行正则表达式匹配, class 也很有值(value)。 LITERAL的组合和 CASE_INSENSITIVE flags 可以使用预期的语义进行搜索,而无需将整个字符串转换为小写(顺便说一下,这对于所有可能的情况都不够)。对于这种匹配,准备工作将包括为 Boyer–Moore Algorithm 构建必要的数据结构。为了更有效的搜索,内部。

该 map 可以重复使用。

对于您的特定任务,使用它的一种方法是
filters.entrySet().stream()
.map(e -> Map.entry(e.getKey(), listofComments.stream().filter(e.getValue()).count()))
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEachOrdered(e -> System.out.printf("%-7s%3d%n", e.getKey(), e.getValue()));

这将为您的示例数据打印:
Mangoes  3
Apple 2
Oranges 2
Figs 1

请注意 filters map 已经按字母顺序排序, sorted第二个流操作是 stable对于具有定义的遇到顺序的流,因此只需按出现次数排序,具有相等元素的条目将保持其相对顺序,即源映射中的字母顺序。
Map.entry(…)需要 Java 9 或更新版本。对于 Java 8,您必须使用类似 new AbstractMap.SimpleEntry(…)反而。

关于Java 8 流 : Count the occurrence of elements(List<String> list1) from list of text data(List<String> list2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60443274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com