سؤال

لدي قائمة من الأشياء لا تحتاج إلى فرز حسب خصائص واحدة من حقولهم.لقد سمعت أن SortedMap و المقارنة هي أفضل طريقة للقيام بذلك.

  1. القيام بتنفيذ مقارنة مع فئة أنا الفرز ، أو إنشاء فئة جديدة?
  2. كيف يمكنني إنشاء مثيل SortedMap و تمر في المقارنة?
  3. كيف يصنف العمل ؟ سوف تلقائيا فرز كل شيء كما كائنات جديدة يتم إدراج ؟

تحرير: هذا القانون يعطي لي خطأ:

private TreeMap<Ktr> collection = new TreeMap<Ktr>();

(Ktr تنفذ Comparator<Ktr>).الكسوف تقول انها تتوقع شيئا مثل TreeMap<K, V>, لذا عدد من المعلمات أنا توريد غير صحيحة.

هل كانت مفيدة؟

المحلول

  1. أبسط طريقة هي أن تنفيذ Comparable مع الكائنات الموجودة ، على الرغم من أن يمكن بدلا من ذلك إنشاء Comparator ونقله إلى SortedMap.
    علما بأن Comparable و Comparator نوعان مختلفان من الأشياء ؛ فئة التنفيذ Comparable يقارن this إلى كائن آخر ، بينما فئة التنفيذ Comparator يقارن اثنين أخرى الكائنات.
  2. إذا قمت بتطبيق Comparable, أنت لا تحتاج إلى تمرير أي شيء خاصة إلى المنشئ.فقط اتصل new TreeMap<MyObject>(). (تحرير: إلا أنه بالطبع Maps تحتاج اثنين من المعلمات عامة ، ليست واحدة.سخيفة لي!)
    إذا كنت بدلا من ذلك إنشاء فئة أخرى تنفيذ Comparator, تمرير مثيل من هذه الفئة إلى المنشئ.
  3. نعم, وفقا TreeMap Javadocs.

تحرير: على إعادة قراءة السؤال ، لا شيء من هذا يبدو منطقيا.إذا كان لديك بالفعل قائمة الشيء المعقول القيام به هو تنفيذ Comparable ثم اتصل Collections.sort على ذلك.لا الخرائط اللازمة.

قليلا من التعليمات البرمجية:

public class MyObject implements Comparable<MyObject> {
    // ... your existing code here ...
    @Override
    public int compareTo(MyObject other) {
        // do smart things here
    }
}

// Elsewhere:
List<MyObject> list = ...;
Collections.sort(list);

كما هو الحال مع SortedMap, هل يمكن بدلا من ذلك إنشاء Comparator<MyObject> ونقله إلى Collections.sort(List, Comparator).

نصائح أخرى

1.

هذا يعتمد على الوضع.دعونا نقول الكائن ينبغي النوع من قبل الكائن ب في مجموعة الخاصة بك.إذا عموما فإنه من المنطقي أن ينظر في أقل من ب ، ثم تنفيذ مماثلة من شأنه أن يجعل الشعور.إذا كان النظام الوحيد المنطقي في السياق الذي تستخدم مجموعة ، ثم ربما يجب عليك إنشاء للمقارنة.

2.

new TreeMap(new MyComparator());

أو دون خلق MyComparator الدرجة:

new TreeMap(new Comparator<MyClass>() {
    int compare(MyClass o1, MyClass o2) { ... }
});

3.نعم.

منذ لديك قائمة والحصول على خطأ لأن لديك حجة واحدة على الخريطة أنا افترض أنك ترغب في فرز مجموعة:

SortedSet<Ktr> set = new TreeSet<Ktr>(comparator);

هذا وسوف تبقي مجموعة فرز ، أيمكرر سيتم إرجاع العناصر في ترتيب الفرز.هناك أيضا أساليب محددة SortedSet التي قد ترغب في استخدامها.إذا كنت تريد أن تذهب إلى الوراء يمكنك استخدام NavigableSet.

جوابي تفترض كنت تستخدم TreeMap تنفيذ SortedMap.

1.) في حالة استخدام TreeMap, لديك خيار.يمكنك إما تنفيذ Comparable مباشرة على فئة أو تمرير منفصل Comparator منشئ.

2.) على سبيل المثال:

Comparator<A> cmp = new MyComparator();
Map<A,B> map = new TreeMap<A,B>(myComparator);

3.) نعم هذا هو الصحيح.داخليا TreeMap يستخدم الأحمر-الأسود شجرة لتخزين العناصر في الترتيب كما يتم إدراج;تكلفة الوقت من أداء إدراج (أو استرجاع) O(log N).

يمكنك جعل Comparator<ClassYouWantToSort>.ثم المقارنة يقارن الحقل الذي تريد الفرز على.

عند إنشاء TreeMap, إنشاء TreeMap<ClassYouWantToSort>, و أنت تمر في Comparator كحجة.ثم عند إدراج كائنات من نوع ClassYouWantToSort, ، TreeMap يستخدم Comparator ترتيبها بشكل صحيح.

تحرير:كما Adamski الملاحظات ، يمكنك أيضا جعل ClassYouWantToSort نفسها Comparable.ميزة هي أن يكون لديك عدد أقل من دروس التعامل مع الرمز هو أبسط ، ClassYouWantToSort يحصل مريحة الافتراضي الطلب.العيب هو أن ClassYouWantToSort قد لا يكون واحد واضح يأمر ، و لذلك سيكون لديك لتنفيذ Comparables لحالات أخرى على أي حال.كما أنك قد لا تكون قادرا على تغيير ClassYouWantToSort.

EDIT2:إذا كان لديك مجموعة من الأشياء التي كنت رمي في جمع و ليس Map (أيليس تعيين من مجموعة من الكائنات إلى آخر) ثم تريد TreeSet, لا TreeMap.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top