【问题标题】:Multiple comparators in a class一个类中的多个比较器
【发布时间】:2018-05-11 14:37:55
【问题描述】:

我很难找到一个很好的答案。我找到了 this one about custom comparators,但不完整:

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

应该可以,但我不知道比较部分是如何工作的。这是我的课:

package ZVCVolkel_Logic;

import java.util.Comparator;

public class Vliegtuig implements Comparator<Vliegtuig>{

    private String naam;
    private String type;
    private String status;

    private Hangaar hangaar;

    public Vliegtuig(String naam, String type, String status, Hangaar hangaar){
        this.naam = naam;
        this.type = type;
        this.status = status;
        this.hangaar = hangaar;
    }
}

现在我需要一个用于statusHangaar.getName() 的比较器。有人可以帮忙吗?

不是那个,他只有一个比较器。我也可以做到这一点,但不能在 1 个班级中使用 2 个不同的班级。

【问题讨论】:

  • 问题是?
  • 您阅读文档了吗?比较非常明确。
  • 如何为 status 和 Hangaar.getName() 做一个比较器
  • 你的班级Vliegtuig也应该实现Comparable而不是Comparator
  • @Code-Apprentice 我认为这不会解决 OP 的问题——OP 需要两个比较器,而不是一个 Comparable。

标签: java comparator


【解决方案1】:

比较器接口有一个方法compare返回一个int值来判断两个对象之间的关系。

它会返回:

作为第一个参数的负整数、零或正整数小于、等于或大于第二个参数。

static Comparator<Vliegtuig> hangaarNameComparator() {
    return new Comparator<Vliegtuig>(){
              public int compare(Vliegtuig one, Vliegtuig two) {
                 return one.getHangaar().getName().compareTo(two.getHangaar().getName());
              }
           }
}

如果getHangaar()hangaar.getName() 返回null,您可能需要处理NullPointerException

在 java 8 中你可以这样做:

Comparator<Vliegtuig> hangaarNameComparator = Comparator.comparing(Vliegtuig::getHagaar, 
                            Comparator.comparing(Hagaar::getName));

【讨论】:

  • 所以我得到了 Vliegtuigs 'vliegtuigen' 的列表。那将会; Collections.sort(vliegtuigen, hangaarNameComparator)?
  • 使用`hangaarNameComparator`显示你的代码。我猜你说错了
  • Collections.sort(vliegtuigen, getHanhaarComparator);
  • @MrEmper ? 也许你应该看看:Calling static method on a class?
  • 不确定如何应用它,但它确实让我的错误更清晰
【解决方案2】:

在比较器实现中,您需要比较 2 个对象。例如,您可以参考大多数 JDK 类,例如 java.lang.Integer

在您的情况下,解决方案是使用来自如下对象的嵌入式压缩器:

Comparator<Vliegtuig> nameComparator = new Comparator<>() {
    @Override
    public int compare(Vliegtuig o1, Vliegtuig o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

而且您不需要通过 Vliegtuig 扩展 Comparator。

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 2012-04-07
    • 2019-01-13
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    相关资源
    最近更新 更多