Как да направя 2 сравними метода само в един клас?

Имам един клас, който вече сортирам по един атрибут. Сега трябва да направя друго нещо, че трябва да създам друг начин за сортиране на моите данни. Как да го направя, за да мога да избирам между двата начина. Единствената команда, която знам, е Collections.sort, която ще вземе метода compareTo от класа, който искам, за да сравни данните му.

Възможно ли е изобщо?


person Gondim    schedule 13.12.2010    source източник
comment
Ако е възможно да се използват по-ясни думи вместо нещо и начин, тогава даването на добри отговори ще бъде по-лесно. Както е сега, трябва с уважение да призная, че се борех да разбера точния въпрос.   -  person lance.dolan    schedule 06.03.2018


Отговори (3)


Това, което трябва да направите, е да внедрите персонализиран Comparator. И след това използвайте:

Collections.sort(yourList, new CustomComparator<YourClass>());

По-конкретно, можете да напишете: (Това ще създаде анонимен клас, който имплементира Comparator.)

Collections.sort(yourList, new Comparator<YourClass>(){
    public int compare(YourClass one, YourClass two) {
        // compare using whichever properties of ListType you need
    }
});

Можете да вградите тези във вашия клас, ако желаете:

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

Може да се използва така:

Collections.sort(yourList, YourClass.getAttribute2Comparator());
person jjnguy    schedule 13.12.2010

Можете да имате само един compareTo() метод във вашия клас.

Ако искате да сортирате един и същи клас по повече от един начин, създайте Comparator реализации.

person jzd    schedule 13.12.2010

Ако двата метода изискват абсолютно еднакъв отпечатък, може да претоварвате неуместно един клас с множество употреби, което ще бъде решено чрез коригиране на йерархията на класовете ви - например вместо да използвате "форма", подкласирайте го с "овал", "правоъгълник" и т.н.

Ако подкласирането няма смисъл, трябва да създадете различни класове за сравнение. В Java често използвате Comparator за сравнения. Създайте няколко (или създайте конфигурируем компаратор): IsbnComparator, AuthorComparator и др.

О, и конфигурируемата опция би била:

 BookComparator implements Compartor {
   enum FIELD { AUTHOR, ISBN, ... };
   setSortOrder(int rank, FIELD field){...}
 }
person atk    schedule 13.12.2010