合并两个比较器排序

时间:2017-10-10 20:25:32

标签: java sorting comparator

我有以下课程:

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());

这是按预期工作的,但我想知道是否有办法只使用一种排序方法,即将这两个比较器合并为一个,以优化代码。

1 个答案:

答案 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());
    }
}

我更改了代码以避免自动装箱(因为我讨厌它; - )