#java #comparator
#java #компаратор
Вопрос:
Я хочу получить количество повторяющихся данных при их сортировке. Для этого я использую компаратор. Я хочу увеличить переменную counter, когда два сравниваемых объекта имеют одинаковые свойства.
Я попытался объявить локальную переменную и увеличить ее внутри метода compare(). Но для того, чтобы использовать его внутри метода compare, оно должно быть объявлено как final, но оно является окончательным, тогда его значение нельзя изменить.
int counter = 0;
Collections.sort(drivDataList, new Comparator<DrivData>() {
@Override
public int compare(DrivData o1, DrivData o2) {
long l1 = o1.getTime();
long l2 = o1.getTime();
if (l1 > l2) {
return 1;
} else if (l1 < l2) {
return -1;
} else {
counter ;
return 0;
}
}
});
// use counter
Как я могу этого добиться?
Ответ №1:
Для этого у вас есть 2 варианта :
- Используйте целочисленный массив вместо int
final int[] counter = {0};
Collections.sort(drivDataList, new Comparator<DrivData>() {
@Override
public int compare(DrivData o1, DrivData o2) {
long l1 = o1.getTime();
long l2 = o1.getTime();
if (l1 > l2) {
return 1;
} else if (l1 < l2) {
return -1;
} else {
counter[0] ;
return 0;
}
}
});
//use counter
- Используйте пользовательский класс со свойством int
final MyCounter counter = new MyCounter();
Collections.sort(drivDataList, new Comparator<DrivData>() {
@Override
public int compare(DrivData o1, DrivData o2) {
long l1 = o1.getTime();
long l2 = o1.getTime();
if (l1 > l2) {
return 1;
} else if (l1 < l2) {
return -1;
} else {
counter.incrementN();
return 0;
}
}
});
// use counter
class MyCounter {
private int n;
public MyCounter() {
this.n = 0;
}
public int getN() {
return n;
}
public void incrementN() {
this.n ;
}
}
Надеюсь, это поможет.
Обновление : Как указал @andrianekena-moise, вы также можете создать класс с полем счетчика, которое расширяет Comparator.
Ответ №2:
Вы можете реализовать Comparator<DrivData>
в одном классе и объявить счетчик как поле внутри этого класса следующим образом :
class Ddcomparator implements Comparator<DrivData> {
int counter = 0;
public int getCounter() {
return counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
@Override
public int compare(DrivData o1, DrivData o2) {
long l1 = o1.getTime();
long l2 = o1.getTime();
if (l1 > l2) {
return 1;
} else if (l1 < l2) {
return -1;
} else {
counter ;
return 0;
}
}
}
Затем вы можете получить counter
переменную после :
Ddcomparator comparator = new Ddcomparator();
Collections.sort(drivDataList, comparator);
int counter = c.getCounter();