Как да направя този код с помощта на Comparator?

За съжаление не работя с Java от дълго време. Имам клас, който сортира тип int, и се опитвам да направя това, но това не се компилира:


MySort.sort(vectorOfInt, new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
    return (int)o1 - (int)o2;
    }
    });

Бих искал да сортирам вектор от int, използвайки този метод, като използвам компаратора за сортиране във възходящ ред.


public static  void sort(T[] a, Comparator c) {
        sort(a, 0, a.length, c);
}


person alansiqueira27    schedule 03.05.2011    source източник
comment
можете ли да обясните реда на полумесец?   -  person Bala R    schedule 03.05.2011
comment
полумесец = възходящ. Което е: 1,2,3,4,5,6,7...   -  person alansiqueira27    schedule 03.05.2011
comment
не може да преобразува от обект в int   -  person alansiqueira27    schedule 03.05.2011


Отговори (3)


Примерният код е доста непълен, но като начало не можете да прехвърлите Object към int. Използвайте

return (Integer) o1 - (Integer) o2;

вместо.

person Nils Weinander    schedule 03.05.2011
comment
Актуализирах кода. Не разбирам много от първия параметър. Можеш ли да ми помогнеш? Благодаря. - person alansiqueira27; 03.05.2011
comment
@Seva, първият параметър T[] a е масив от общ тип T, т.е. класът е дефиниран като MySort‹T›. - person Nils Weinander; 03.05.2011

Първо, не използвайте Vector или Hashtable по този въпрос, и двете се считат за deprecated за всички практически цели. Използвайте List или Map реализации.

Използвайте List<Integer> вместо това, това е модерният и правилен начин за манипулиране на списък от Integers като обекти.

final List<Integer> list = new ArrayList<Integer>();
... populate list ...
Collections.sort(list);

Ако искате да използвате различен Comparator, тогава можете да използвате:

Collections.sort(list, comparator);

Тъй като Integer имплементира Comparable, това по подразбиране ще сортира List<Integer> във възходящ ред. Цяло число за подробности.

Това е правилният идиоматичен начин за сортиране на List и Collection класове в съвременната Java. Всичко друго показва, че не разбирате езика и това, което предлага.

person Community    schedule 03.05.2011
comment
благодаря, но в моя случай вече имам клас за сортиране. Актуализирах кода. - person alansiqueira27; 03.05.2011
comment
тогава го правите погрешно, никога не трябва да внедрявате отново код, който вече е в стандартната библиотека. - person ; 03.05.2011
comment
@Jarrod, не съм сигурен какво се опитваш да постигнеш, но твоите обратни точки близо до Списък или Карта създават странно форматиране. - person Pops; 03.05.2011
comment
този код е алгоритъм за сортиране, който в момента не е внедрен в Java 6. Той ще бъде внедрен в Java 7. - person alansiqueira27; 03.05.2011
comment
Ако използвате Comparator, той вече е в Java 6. Comparator и „Comparable“ е в езика от самото начало. Ако искате да сортирате Integer, тогава той вече е вграден. Не виждам нищо новаторско в примера ви с код, което да е ново или подобрено спрямо това, което Integer вече прави. - person ; 03.05.2011
comment
не си разбрал, новото нещо, за което говоря, е алгоритъмът TimSort. В момента е настроено бързо сортиране или настроено сортиране чрез сливане. - person alansiqueira27; 03.05.2011

Можете да направите въведен Comparator и спечелихте няма нужда да излагам аргументи.

MySort.sort(vectorOfInt, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
      return o1 - o2;
    }
    });

РЕДАКТИРАНЕ:
Първо, моля, не наричайте масив вектор. Vector е Java клас и хората ще приемат това е, което използвате, когато назовавате променливата vectorOfInt.

Грешката на компилатора, която получавате, е защото компилаторът не знае, че вашият Comparator работи на Integers. Тъй като всичко, което вижда, е Object, то не знае, че o1 всъщност е Integer и може да бъде разопаковано, за да бъде int. Като посочите типа на компаратора, вие предоставяте повече информация и преобразуването може да бъде направено имплицитно.

person unholysampler    schedule 03.05.2011
comment
Актуализирах кода. Не разбирам много от първия параметър. Можеш ли да ми помогнеш? Благодаря. - person alansiqueira27; 03.05.2011
comment
благодаря за векторното обучение. Но все още не мога да компилирам, защото методът за сортиране очаква T[] a параметър. - person alansiqueira27; 03.05.2011
comment
@Seva: Къде е дефинирано T? Това не е общ метод, така че трябва да бъде зададен от съдържащия клас. Какъв е подписът на класа, който съдържа sort()? - person unholysampler; 04.05.2011