我有以下类(class):
public class Orador {
int id;
int situacao;
Expediente expediente;
}
public class Expediente {
int id;
int sequencia;
}
属性“situacao”可以是(0、1 或 2)。 属性“sequencia”可以是(0,1,2,3,4,...)。
我想对一些 Orador 对象进行排序:首先按 situacao,第二个按 sequencia,但 situacao = 1 必须是第一个,然后是 0 和 2。
我可以使用 2 个 Comparator 类来做到这一点:
public class SequenciaExpedienteComparator implements Comparator<Orador> {
@Override
public int compare(Orador o1, Orador o2) {
return o1.getExpediente().getSequencia().compareTo(o2.getExpediente().getSequencia());
}
}
public class DiscursoRealizadoComparator implements Comparator<Orador> {
@Override
public int compare(Orador o1, Orador o2) {
Integer situacaoOrador1 = ((Orador) o1).getSituacao().value();
Integer situacaoOrador2 = ((Orador) o2).getSituacao().value();
// situacao == 1 must be the first in the list
if (situacaoOrador1 == 1) {
return -1;
}
if (situacaoOrador2 == 1) {
return 1;
}
return situacaoOrador1.compareTo(situacaoOrador2);
}
}
所以我调用两种排序方法:
Collections.sort(listaOradores, new SequenciaExpedienteComparator());
Collections.sort(listaOradores, new DiscursoRealizadoComparator());
这按预期工作,但我想知道是否有一种方法可以仅使用一种排序方法来实现此目的,即将这两个比较器合并为一个,以优化代码。
最佳答案
你可以这样做,例如像这样:
final static Comparator<Orador> comparator = new Comparator<Orador> {
@Override
public int compare(Orador o1, Orador o2) {
if (o1.getSituacao() == 1) {
return -1;
}
if (o2.getSituacao() == 1) {
return 1;
}
int ret = Integer.compare(o1.getSituacao(), o2.getSituacao());
if (ret != 0) {
return ret;
}
return Integer.compare(o1.getExpediente().getSequencia(),
o2.getExpediente().getSequencia());
}
}
我更改了代码以避免自动装箱(因为我讨厌它;-)
关于java - 合并两个比较器排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46675393/