我有以下课程:
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,然后是第二顺序,但是situacao = 1必须先是que,然后是0和2。
我能用2比较器类做到这一点:
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());
这是按预期工作的,但我想知道是否有办法只使用一种排序方法,即将这两个比较器合并为一个,以优化代码。
答案 0 :(得分:1)
你可以这样做,例如像这样:
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());
}
}
我更改了代码以避免自动装箱(因为我讨厌它; - )