计算ArrayList中项目的出现次数并列出前N个项目

时间:2015-08-18 08:09:02

标签: java sorting guava

情景:

作为此question的后续内容,我有一个java.util.ArrayList<Parcel>和一个Parcel对象。

public class Parcel {
    /** The name. */
    private String name;

    /** The address. */
    private String address;

    /** The contact no. */
    private String contactNo;

    /** The postal code. */
    private String postalCode;

    // Accessors and mutators
} 

我有一个方法可以从InputStream返回包裹列表。

List<Parcel> parcels = parcelManager.getParcelList(inputStream);


@Test
public void testParcelBeanReturnCount() {
   Assert.assertEquals(13, tester.getParcelList(inputStream)); // works fine.
}

现在,如何列出前N个邮政编码以及交付的包裹数量(到特定的邮政编码)?我尝试使用Guava的Multiset API。

Multiset<Parcel> postalCodeCount = HashMultiset.create(parcels);

System.out.println(postalCodeCount.size()); // 13.

1 个答案:

答案 0 :(得分:2)

班级Parcel需要明确定义hashCode()equals()

请参阅HashCode and Equals method in Java object

或者,您可以使用Java8:

List l = parcels.stream()
         .collect(Collectors.groupingBy(p -> p.getPostalCode()))
         .entrySet()
         .stream()
         .sorted((e1, e2) -> Integer.compare(e2.getValue().size(), e1.getValue().size()))
         .limit(N) //Top N
         .collect(Collectors.toList());