Как изменить значение переменной внутри метода Compare () Comparator - PullRequest
1 голос
/ 29 марта 2019

Я хочу получить количество повторяющихся данных при сортировке.Для этого я использую Comparator.Я хочу увеличить переменную счетчика, когда сравниваемые объекты имеют одинаковые свойства.

Я попытался объявить локальную переменную и увеличить ее внутри метода 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

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Для этого у вас есть 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.

0 голосов
/ 29 марта 2019

Вы можете реализовать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...