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

时间:2019-03-29 09:23:29

标签: java comparator

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

我尝试声明一个局部变量,然后在compare()方法中对其进行递增。但是,要在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 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

您可以在一个类中实现cannot convert from System.Threading.Task.Task to System.Func<System.Threading.Task.Task> ,并在此类中将counter声明为字段:

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