java - 合并两个比较器排序

标签 java sorting comparator

我有以下类(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/

相关文章:

arrays - 需要帮助证明循环不变性(简单的冒泡排序,部分正确性)

python - 如何按规则排序但有重复项解决循环引用?

c++ - 升压变体比较器

Java 8 lambda : Comparator

C++ std::set 比较器

java - 图形 REST API -- 阅读电子邮件 (Java) -- NoPermissionsInAccessToken

Java 编译正则表达式错误

java - Java Spring中的实例之间是否可以不共享静态字段?

java - Scala 的 java char[] 等价物是什么?

c# - 使用对象数组中的数组键对对象进行排序