如何在比较器的 compare() 方法中更改变量值



我想在排序时获取重复数据的计数。为此,我正在使用比较器。我想在被比较的 2 个对象具有相同属性时增加计数器变量。

我尝试声明一个局部变量并在 compare(( 方法中递增它。但是为了在比较方法中使用它,它需要声明为 final,但它是 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 个选项:

  • 使用整数数组而不是 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 的计数器字段的类。

您可以在一个类中实现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();

最新更新