繁体   English   中英

在Java中实现python count函数的最佳方法是什么?

[英]What is the best way to implement the python count function in java?

我正在学习如何在Java中使用流,并且我想知道将python count功能复制到Java中的最有效方法。

对于不熟悉python计数的人,请参见此处

我已经完成了一个简单的实现,但是我怀疑这是否会添加到生产级环境中:

private List<String> countMessages(List<String> messages) {
        Map<String, Integer> messageOccurrences = new HashMap<>();
        List<String> stackedMessages = new LinkedList<String>();
        this.messages.stream().filter((message) -> (messageOccurrences.containsKey(message))).forEachOrdered((message) -> {
                    int new_occ = messageOccurrences.get(message) + 1;
                    messageOccurrences.put(message, new_occ);
        });
        messageOccurrences.keySet().forEach((key) -> {
            stackedMessages.add(key + "(" + messageOccurrences.get(key) + "times)" );
        });
        return stackedMessages;
    }

任何改进或指针将不胜感激。

要回答“在Java中实现python count函数的最佳方法是什么?”的问题。

Java已经有Collections.frequency可以做到这一点。

但是,如果您想使用流API来做到这一点,那么我相信通用解决方案将是:

public static <T> long count(Collection<T> source, T element) {
       return source.stream().filter(e -> Objects.equals(e, element)).count();
}

那么用例将是:

long countHellp = count(myStringList, "hello");
long countJohn = count(peopleList, new Person("John"));
long count101 = count(integerList, 101); 
...
...

或者,如果您愿意,甚至可以传递谓词:

public static <T> long count(Collection<T> source, Predicate<? super T> predicate) {
       return source.stream().filter(predicate).count();
}

然后,用例将是:

long stringsGreaterThanTen = count(myStringList, s -> s.length() > 10);
long malesCount = count(peopleList, Person::isMale);
long evens = count(integerList, i -> i % 2 == 0); 
...
...

鉴于您对帖子的评论,您似乎想对它进行“分组”并获得每个分组的计数。

public Map<String, Long> countMessages(List<String> messages) {
        return messages.stream()
                       .collect(groupingBy(Function.identity(), counting()));
}

这将从messages列表中创建一个流,然后对其进行分组,并传递counting()作为下游收集器,这意味着我们将检索Map<String, Long> ,其中键是元素,值是该特定字符串的出现。

确保您已导入:

import static java.util.stream.Collectors.*;

对于后一种解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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