العثور على عناصر أفضل n في مجموعة متعددة من مجموعات Google؟

StackOverflow https://stackoverflow.com/questions/3029151

  •  26-09-2019
  •  | 
  •  

سؤال

أ مجموعات جوجل متعددة هي مجموعة من العناصر لكل منها عدد (أي قد يكون موجودًا عدة مرات).

لا أستطيع أن أخبرك كم مرة أريد أن أفعل ما يلي

  1. اصنع رسمًا بيانيًا (MultiSet تمامًا)
  2. احصل على العناصر العليا 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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top