当前位置: 首页 > 面试题库 >

具有多个字段的对象的Java比较器

商同
2023-03-14
问题内容

我有Collection5个字段的对象:

id;
entityType;
entityId;
brandId;
productId;

要排序的ArrayListCollection我写了下面Comparaor

Comparator<Collection> collectionComparator = new Comparator<Collection>() {

    @Override
    public int compare(Collection collection1, Collection collection2) {
        if(collection1.getId().equals(collection2.getId())) {
            if(collection1.getEntityType().equals(collection2.getEntityType())) {
                if(collection1.getEntityId().equals(collection2.getEntityId())) {
                    if(collection1.getBrandId().equals(collection2.getBrandId())) {
                        return collection1.getProductId().compareTo(collection2.getProductId());
                    } else {
                        return collection1.getBrandId().compareTo(collection2.getBrandId());
                    }
                } else {
                    return collection1.getEntityId().compareTo(collection2.getEntityId());
                }
            } else {
                return collection1.getEntityType().compareTo(collection2.getEntityType());
            }
        }

        return collection1.getId().compareTo(collection2.getId());
    }
};

这是Comparator在具有多个要比较的对象的对象上实现的正确方法吗?


问题答案:

您的方法可能是正确的,但是效率低下(不必要地调用equals)并且难以阅读。可以这样重写:

public int compare(Collection c1, Collection c2)
{
    int n;
    n = c1.id.compareTo(c2.id);
    if (n != 0) return n;
    n = c1.entityType.compareTo(c2.entityType);
    if (n != 0) return n;
    n = c1.brandId.compareTo(c2.brandId);
    if (n != 0) return n;
    return c1.productId.compareTo(c2.productId);
}

更好的方法是使用库方法将所有这些逻辑抽象掉,这样您就不必考虑它了。例如使用apache.commons.lang
CompareToBuilder

public int compare(Collection c1, Collection c2)
{
    return new CompareToBuilder()
            .append(c1.id, c2.id)
            .append(c1.entityType, c2.entityType)
            .append(c1.brandId, c2.brandId)
            .append(c1.productId, c2.productId)
            .toComparison();
}


 类似资料:
  • 问题内容: 假设你有一些具有多个字段的对象,可以通过以下方式进行比较: 因此,在此示例中,当你询问是否: 你可能会问a的姓氏是否早于b的姓氏,或者a是否早于b,等等。 在这些对象之间进行多重比较而不增加不必要的混乱或开销的最干净的方法是什么? 界面仅允许一个字段进行比较 在我看来,添加许多比较方法(即,等)比较混乱。 那么最好的方法是什么? 问题答案: 你可以实现比较两个对象的,并且可以根据需要检

  • 问题内容: 我有两个对象,每个对象都有数十个字段: 尽管某些字段的名称不同,但是它们应该具有相同的含义和目的,例如和。我想比较两个类的对象的“相似”字段实际上是否具有相同的值。最优雅的方法是什么? 问题答案: 如果有两个类的字段具有相似的含义,则可以考虑声明一个。 并且具有默认实现: 有被覆盖的风险-确保它永远不会发生。

  • 问题:我试图检查我是否可以使用2个或更多标准对列表(数据类型对象的ArrayList)进行排序。请注意,我知道使用比较器和比较功能。我希望检查是否有方法使用2个或更多标准进行排序,而不必使用我可以轻松使用比较器功能的自定义数据类型。对于1个标准排序,以下代码有效。 在这种情况下,如果我执行以下操作,IntelliJ IDE会立即给出一个错误,表示o.get(3)的“无法解析方法”get(int)”

  • 问题内容: 我有一个包含三个字段(所有字符串类型)的“报告”对象列表- 我有一个排序代码,就像 由于某种原因,我没有排序顺序。一个建议在字段之间放置空格,但是为什么呢? 你认为代码有什么问题吗? 问题答案: 你认为代码有什么问题吗? 是。为什么在比较它们之前将三个字段加在一起? 我可能会做这样的事情:(假设字段按照你希望对其进行排序的顺序)

  • 我正在尝试创建一个二进制搜索程序,该程序可以使用各种类型的变量(int、float、string等)来查看数组中是否存在元素。我正试图找出如何比较变量。下面是我正在使用的内容的草图: 我甚至不确定使用对象是否是最好的方法。

  • 问题内容: 尝试使用gson将以下json字符串解析为java对象 我有我的java类 转换后,我得到的提示对象为空。 有人可以纠正我吗 问题答案: 试试这个JSON: 使用此Java类: 奇迹般有效 输出: