Как изменить значение переменной внутри метода compare() компаратора

#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();