You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Hamcrest匹配器比较排序后的自定义对象数组?

使用Hamcrest对比自定义对象数组的排序结果

当然可以用Hamcrest来实现这个需求,而且相比手动写for循环要简洁优雅得多!

核心思路

Hamcrest提供了IsArrayContainingInOrder.arrayContaining匹配器,它能按顺序断言数组中的每个元素与预期元素相等——刚好契合你对比排序结果的场景。值得庆幸的是,你的Person类已经正确重写了equals方法,这是匹配器能准确比较对象的关键前提。

修改后的测试代码

import org.hamcrest.MatcherAssert;
import org.hamcrest.collection.IsArrayContainingInOrder;
import org.hamcrest.core.Is;
import org.junit.Test;
import java.util.Comparator;

public class SortTest {

    @Test
    public void InsertionSortOfObjectUsingComparator() {
        Person p1 = new Person("A", 18, 800);
        Person p2 = new Person("K", 15, 1800);
        Person p3 = new Person("L", 18, 600);
        Person[] persons = {p1,p2,p3};
        Person[] expected = {p3, p1, p2};
        
        Person[] result = (new Sort()).sort(persons, Comparator.<Person>comparingDouble(o-> o.budget));
        
        // 断言结果数组与预期数组按顺序完全匹配
        MatcherAssert.assertThat(result, IsArrayContainingInOrder.arrayContaining(expected));
        // 额外断言数组长度(可选,确保无元素丢失或冗余)
        MatcherAssert.assertThat(result.length, Is.is(3));
    }
}

// 你的Person类(已正确重写equals)
class Person{
    String name;
    int age;
    double budget;
    Person(String name,int age,double budget){
        this.name = name;
        this.age = age;
        this.budget = budget;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof Person)) return false;
        Person p = (Person) obj;
        return p.budget == budget && p.age == age && p.name.equals(name);
    }
}

关键细节说明

  • arrayContaining匹配器会逐个对比数组元素:它会检查实际数组每个位置的元素,是否与预期数组对应位置的元素通过equals方法判定相等。
  • 若觉得类名冗长,可通过静态导入简化代码:
    import static org.hamcrest.MatcherAssert.assertThat;
    import static org.hamcrest.collection.IsArrayContainingInOrder.arrayContaining;
    import static org.hamcrest.core.Is.is;
    
    简化后断言部分可写成:
    assertThat(result, arrayContaining(expected));
    assertThat(result.length, is(3));
    
  • 务必保证Person类的equals逻辑正确:这是对象比较的基础,你当前的实现已经覆盖了所有属性的对比,完全满足需求。

内容的提问来源于stack exchange,提问作者octopus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:14:01