6

我有一个番石榴Multiset<Integer>,想通过按(a)元素值和(b)元素计数排序的条目独立迭代。我已经使用最简单的方法按元素频率的顺序遍历 Multiset?作为

ImmutableMultiset<Integer> entryList = Multisets.copyHighestCountFirst(myIntegerMultiset);
for (Integer i : entryList) {
    System.out.println("I"+i);
}

但这会返回所有条目,而我想要一个排序列表Multiset.Entry<Integer>(每个唯一值一个),这将允许我获得计数。

独立地,我想获得Multiset.Entry<Integer>按 的值排序的相同列表<Integer>

4

2 回答 2

11
Iterable<Multiset.Entry<Integer>> entriesSortedByCount = 
   Multisets.copyHighestCountFirst(multiset).entrySet();
Iterable<Multiset.Entry<Integer>> entriesSortedByValue =
   ImmutableSortedMultiset.copyOf(multiset).entrySet();

基本上,您只需要entrySet(), 而不是迭代Multiset自身。

于 2013-09-30T17:44:58.890 回答
2

您可以获取一组条目,然后根据需要对其进行排序。

以下是获取一组条目的方法:

Set<Multiset.Entry<Integer>> entries = myIntegerMultiset.entrySet();

然后排序我们可以定义两个比较器:

Comparator<Multiset.Entry<Integer>> byCount = new Comparator<Multiset.Entry<Integer>>() {
    int compare(Multiset.Entry<Integer> e1, Multiset.Entry<Integer> e2) {
        return e2.getCount() - e1.getCount();
    }
}

Comparator<Multiset.Entry<Integer>> byValue = new Comparator<Multiset.Entry<Integer>>() {
    int compare(Multiset.Entry<Integer> e1, Multiset.Entry<Integer> e2) {
        return e2.getElement() - e1.getElement();
    }
}

然后,您可以将比较器提供给树集以获取排序集合:

Set<Multiset.Entry<Integer>> entries = myIntegerMultiset.entrySet();
Set<Multiset.Entry<Integer>> entriesSortedByCount = Sets.newTreeset(byCount);
entriesSortedByCount.addAll(entries);
Set<Multiset.Entry<Integer>> entriesSortedByValue = Sets.newTreeset(byValue);
entriesSortedByValue.addAll(entries);

实际上,Louis Wasserman 的答案要好得多,但如果您想自定义排序,我也会发布这个答案。

于 2013-09-30T17:48:41.687 回答