2010-06-12 30 views
13

A Google CollectionsMultiset là tập hợp các phần tử mà mỗi phần tử có số đếm (nghĩa là có thể có nhiều lần).Tìm các phần tử N hàng đầu trong một Multiset từ Google Bộ sưu tập?

Tôi không thể cho bạn biết bao nhiêu lần tôi muốn làm như sau

  1. Thực hiện một biểu đồ (chính xác MultiSet)
  2. Lấy yếu tố N đầu bởi đếm từ histogram

Ví dụ: 10 URL hàng đầu (theo # lần được đề cập), 10 thẻ hàng đầu (bằng # lần được áp dụng), ...

Cách kinh điển để làm gì # 2 cho Bộ sưu tập Google Multiset?

Here là một bài đăng trên blog về nó, nhưng mã đó không hoàn toàn là những gì tôi muốn. Đầu tiên, nó trả về mọi thứ, không chỉ trên đầu N. Thứ hai, nó sao chép (có thể tránh được một bản sao không?). Thứ ba, tôi thường muốn một loại xác định, tức là tiebreak nếu đếm bằng nhau. nits khác: nó không phải là tĩnh, vv

Trả lời

4

tôi đã viết các phương pháp với chức năng cơ bản mà bạn yêu cầu, ngoại trừ việc chúng thực hiện các bản sao và thiếu logic ràng buộc xác định. Hiện tại, chúng là nội bộ của Google, nhưng chúng tôi có thể mở nguồn chúng tại một số thời điểm. This Guava issue có chữ ký phương thức.

Thuật toán của chúng tương tự như bài đăng trên blog: sắp xếp danh sách các mục nhập. Nó sẽ nhanh hơn, nhưng phức tạp hơn, để sử dụng tốt hơn selection algorithm.

EDIT: kể từ Ổi 11, đây là implemented

+0

làm thế nào để sử dụng nó để có được các yếu tố N hàng đầu? –

3

Để cung cấp một góc nhìn cho mọi người nhận xét, tôi sẽ đăng một phiên bản sửa đổi một chút trong những bài viết trên blog tôi tham khảo:

package com.blueshiftlab.twitterstream.summarytools; 

import com.google.common.collect.ImmutableList; 
import com.google.common.collect.Multiset; 
import com.google.common.collect.Ordering; 
import com.google.common.collect.Multiset.Entry; 

public class Multisets { 
    // Don't construct one 
    private Multisets() { 
    } 

    public static <T> ImmutableList<Entry<T>> sortedByCount(Multiset<T> multiset) { 
     Ordering<Multiset.Entry<T>> countComp = new Ordering<Multiset.Entry<T>>() { 
      public int compare(Multiset.Entry<T> e1, Multiset.Entry<T> e2) { 
       return e2.getCount() - e1.getCount(); 
      } 
     }; 
     return countComp.immutableSortedCopy(multiset.entrySet()); 
    } 

    public static <T> ImmutableList<Entry<T>> topByCount(Multiset<T> multiset, 
      int max) { 
     ImmutableList<Entry<T>> sortedByCount = sortedByCount(multiset); 
     if (sortedByCount.size() > max) { 
      sortedByCount = sortedByCount.subList(0, max); 
     } 

     return sortedByCount; 
    } 
} 
+0

Nếu tôi hiểu đúng, giải pháp này sẽ sao chép và sắp xếp các bộ sưu tập mỗi khi bạn muốn lấy lại các yếu tố N hàng đầu. Tôi không chắc các yêu cầu của bạn là gì, nhưng giải pháp đống phân loại đã đánh bại điều này trong cả thời gian và không gian nên tôi không chắc chắn về lợi ích của nó là gì. – danben

+0

Bạn đang tối ưu hóa tốc độ, tôi đang tìm kiếm ít nhất # dòng mã được viết bởi tôi. – dfrankow

+0

Tôi thấy - điều đó không rõ ràng từ bài đăng của bạn, đặc biệt là kể từ khi bạn hỏi về cách tránh tạo bản sao. – danben

Các vấn đề liên quan