العثور على عناصر أفضل n في مجموعة متعددة من مجموعات Google؟
سؤال
أ مجموعات جوجل متعددة هي مجموعة من العناصر لكل منها عدد (أي قد يكون موجودًا عدة مرات).
لا أستطيع أن أخبرك كم مرة أريد أن أفعل ما يلي
- اصنع رسمًا بيانيًا (MultiSet تمامًا)
- احصل على العناصر العليا N حسب العد من الرسم البياني
أمثلة: أعلى 10 عناوين URL (بواسطة # مرات مذكورة) ، أفضل 10 علامات (من خلال الأوقات المطبقة) ، ...
ما هي الطريقة الكنسية للقيام رقم 2 بالنظر إلى مجموعة Google Multiset؟
هنا هو منشور مدونة حول هذا الموضوع ، لكن هذا الرمز ليس ما أريده تمامًا. أولاً ، إنها تُرجع كل شيء ، وليس فقط N. ثانيًا ، فهي نسخ (هل من الممكن تجنب نسخة؟). ثالثًا ، أرغب عادةً في نوع حتمي ، أي برقة التعادل إذا كانت التهم متساوية. شبكات أخرى: إنها ليست ثابتة ، إلخ.
المحلول
لقد كتبت أساليب مع الوظائف الأساسية التي تطلبه ، إلا أنها تؤدي نسخًا وتفتقر إلى منطق التعادل الحتمي. إنها حاليًا داخلية لـ Google ، لكننا قد نفتحها في مرحلة ما. هذا الجوافة مشكلة لديه توقيعات الطريقة.
تشبه الخوارزمية الخاصة بهم منشور المدونة: فرز قائمة الإدخالات. سيكون أسرع ، ولكن أكثر تعقيدًا ، لاستخدام أفضل خوارزمية الاختيار.
تحرير: منذ جوافا 11 ، هذا هو مُنفّذ
نصائح أخرى
لإعطاء منظور آخر للأشخاص للتعليق عليه ، سأقوم بنشر نسخة معدلة قليلاً من منشور المدونة الذي أشرت إليه:
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;
}
}