جافا:SortedMap, TreeMap, مقارنة ؟ كيفية استخدام ؟
-
10-07-2019 - |
سؤال
لدي قائمة من الأشياء لا تحتاج إلى فرز حسب خصائص واحدة من حقولهم.لقد سمعت أن SortedMap و المقارنة هي أفضل طريقة للقيام بذلك.
- القيام بتنفيذ مقارنة مع فئة أنا الفرز ، أو إنشاء فئة جديدة?
- كيف يمكنني إنشاء مثيل SortedMap و تمر في المقارنة?
- كيف يصنف العمل ؟ سوف تلقائيا فرز كل شيء كما كائنات جديدة يتم إدراج ؟
تحرير: هذا القانون يعطي لي خطأ:
private TreeMap<Ktr> collection = new TreeMap<Ktr>();
(Ktr تنفذ Comparator<Ktr>
).الكسوف تقول انها تتوقع شيئا مثل TreeMap<K, V>
, لذا عدد من المعلمات أنا توريد غير صحيحة.
المحلول
- أبسط طريقة هي أن تنفيذ
Comparable
مع الكائنات الموجودة ، على الرغم من أن يمكن بدلا من ذلك إنشاءComparator
ونقله إلىSortedMap
.
علما بأنComparable
وComparator
نوعان مختلفان من الأشياء ؛ فئة التنفيذComparable
يقارنthis
إلى كائن آخر ، بينما فئة التنفيذComparator
يقارن اثنين أخرى الكائنات. - إذا قمت بتطبيق
Comparable
, أنت لا تحتاج إلى تمرير أي شيء خاصة إلى المنشئ.فقط اتصلnew TreeMap<MyObject>()
. (تحرير: إلا أنه بالطبعMaps
تحتاج اثنين من المعلمات عامة ، ليست واحدة.سخيفة لي!)
إذا كنت بدلا من ذلك إنشاء فئة أخرى تنفيذComparator
, تمرير مثيل من هذه الفئة إلى المنشئ. - نعم, وفقا
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
.