首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python计数器可供Java选择

Python计数器可供Java选择
EN

Stack Overflow用户
提问于 2015-09-02 08:41:52
回答 2查看 6.1K关注 0票数 19

我一直在使用Python中的计数器()数据结构作为键值存储,它允许我使用most_common方法根据对象的值进行排序。更多信息,这里

Java语言有类似的数据结构吗?例如,我已经看到了许多相关的答案,这些答案侧重于按数据结构对HashMapsTreeMaps进行排序,但最初并没有为此目的定义。在我的例子中,我通常需要保留对象的计数器,然后选择最常见的或得分最高的(Top查询)。然而,这对我来说是很困难的,因为我需要插入到一个HashMap,然后排序或使用多个数据结构。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-02 08:46:13

来自这里

计数器类类似于其他语言中的袋子或多集。

Java没有多集类,也没有模拟类。番石榴有一个MultiSet集合,完全可以满足您的需要。

在纯Java中,您可以使用Map和新的合并方法:

代码语言:javascript
复制
final Map<String, Integer> counts = new HashMap<>();

counts.merge("Test", 1, Integer::sum);
counts.merge("Test", 1, Integer::sum);
counts.merge("Other", 1, Integer::sum);
counts.merge("Other", 1, Integer::sum);
counts.merge("Other", 1, Integer::sum);

System.out.println(counts.getOrDefault("Test", 0));
System.out.println(counts.getOrDefault("Other", 0));
System.out.println(counts.getOrDefault("Another", 0));

输出:

代码语言:javascript
复制
2
3
0

您可以用几行代码将这种行为包装在类中:

代码语言:javascript
复制
public class Counter<T> {
    final Map<T, Integer> counts = new HashMap<>();

    public void add(T t) {
        counts.merge(t, 1, Integer::sum);
    }

    public int count(T t) {
        return counts.getOrDefault(t, 0);
    }
}

像这样使用它:

代码语言:javascript
复制
final Counter<String> counts = new Counter<>();

counts.add("Test");
counts.add("Test");
counts.add("Other");
counts.add("Other");
counts.add("Other");

System.out.println(counts.count("Test"));
System.out.println(counts.count("Other"));
System.out.println(counts.count("Another"));

输出:

代码语言:javascript
复制
2
3
0
票数 14
EN

Stack Overflow用户

发布于 2015-09-02 09:25:58

下面是一个类,看起来它实现了足够多的Counter来执行您想做的事情。

代码语言:javascript
复制
static class Counter<T> {

    final ConcurrentMap<T, Integer> counts = new ConcurrentHashMap<>();

    public void put(T it) {
        add(it, 1);
    }

    public void add(T it, int v) {
        counts.merge(it, v, Integer::sum);
    }

    public List<T> mostCommon(int n) {
        return counts.entrySet().stream()
                // Sort by value.
                .sorted((e1, e2) -> Integer.compare(e2.getValue(), e1.getValue()))
                // Top n.
                .limit(n)
                // Keys only.
                .map(e -> e.getKey())
                // As a list.
                .collect(Collectors.toList());
    }
}

public void test() {
    Counter<String> c = new Counter<>();
    String[] numbers = {"Zero", "One", "Two", "Three", "Four", "Five", "Six"};
    for (int i = 0; i < numbers.length; i++) {
        c.add(numbers[i], i);
    }
    System.out.println(c.mostCommon(3));
}

它使用Java 8功能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32348453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档