如何在不排序的情况下使用 Comparator<Object> 进行升序、降序
How to use Comparator<Object> for Ascending, Descending without sorting
我试图得到答案,但每个关于比较器的问题都与排序有关。
我正在尝试使用具有来自 dog.getAge()
的值的比较器
我的 class 长得像
public final class Dog implements Comparator<Dog>{
...
@Override
public int compare(Dog o1, Dog o2) {
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o2.getAge() > o1.getAge()) {
return 2;
}
return 0;
}
}
在主要 activity 中,我尝试比较狗,但我认为问题是我不知道如何结束此方法,
我也收到一个错误:Fatal Exception thrown on Scheduler.
我想从 api 那里弄到狗。
所以这是我在 MainActivity 中的方法
private List<Dog> dogsArray = new ArrayList<>();
private void checkAscendingOrDescendingDogsAge() {
Dog dog= new Dog();
for (int i = 0; i < dogsArray.size(); i++) {
dog.compare(dogsArray.get(i), dogsArray.get(i + 1));
}
}
无论您的预期用途是什么;这里是:
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o2.getAge() > o1.getAge()) {
return 2;
}
不正确。这个想法是 compareTo()
returns 消极,等于零,积极的结果。自己决定是否要更改该方法的合同是没有意义的: 1 for o1 older than o2; o2 比 o1 大 2。这个接口和那个方法有一个 明确定义的 契约,你只需坚持它。除非你的目标是故意误导你的读者。但请放心,这会很快反噬你。
假设 getAge()
returns,比如 int,您只需将其替换为:
return Integer.compare(o1.getAge(), o2.getAge())
然后 技巧 是定义 其他 方法,例如:
public boolean isOlder(Dog other) {
return compareTo(this, other) > 0;
例如
然后你像这样使用它:
Dog buddy = new Dog(...
Dog sparky = new Dog(...
if (buddy.isOlder(sparky)
我试图得到答案,但每个关于比较器的问题都与排序有关。
我正在尝试使用具有来自 dog.getAge()
我的 class 长得像
public final class Dog implements Comparator<Dog>{
...
@Override
public int compare(Dog o1, Dog o2) {
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o2.getAge() > o1.getAge()) {
return 2;
}
return 0;
}
}
在主要 activity 中,我尝试比较狗,但我认为问题是我不知道如何结束此方法,
我也收到一个错误:Fatal Exception thrown on Scheduler.
我想从 api 那里弄到狗。
所以这是我在 MainActivity 中的方法
private List<Dog> dogsArray = new ArrayList<>();
private void checkAscendingOrDescendingDogsAge() {
Dog dog= new Dog();
for (int i = 0; i < dogsArray.size(); i++) {
dog.compare(dogsArray.get(i), dogsArray.get(i + 1));
}
}
无论您的预期用途是什么;这里是:
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o2.getAge() > o1.getAge()) {
return 2;
}
不正确。这个想法是 compareTo()
returns 消极,等于零,积极的结果。自己决定是否要更改该方法的合同是没有意义的: 1 for o1 older than o2; o2 比 o1 大 2。这个接口和那个方法有一个 明确定义的 契约,你只需坚持它。除非你的目标是故意误导你的读者。但请放心,这会很快反噬你。
假设 getAge()
returns,比如 int,您只需将其替换为:
return Integer.compare(o1.getAge(), o2.getAge())
然后 技巧 是定义 其他 方法,例如:
public boolean isOlder(Dog other) {
return compareTo(this, other) > 0;
例如
然后你像这样使用它:
Dog buddy = new Dog(...
Dog sparky = new Dog(...
if (buddy.isOlder(sparky)