当前位置: 首页 > 知识库问答 >
问题:

LEVENSHTEIN_DISTANCE不通过比较列表忽略顺序

潘俊楚
2023-03-14

我正在尝试比较自定义对象的列表。我设置了LEVENSHTEIN_DISTANCE并创建了自定义比较器。对象之间唯一的区别是列表中值的顺序。我希望“没有变化”,但我得到了listchange。结果和示例如下。我做错了什么?

非常感谢和问候,安德烈

Diff:
1. ListChange{globalId:'my.javers.comparator.ZasFish/', property:'zones', containerChanges:[(2).'my.javers.comparator.ZasCatchZone@7a9273a8'>>'my.javers.comparator.ZasCatchZone@26a7b76d', (1).'my.javers.comparator.ZasCatchZone@4abdb505'>>'my.javers.comparator.ZasCatchZone@7ce6a65d', (0).'my.javers.comparator.ZasCatchZone@1500955a'>>'my.javers.comparator.ZasCatchZone@e874448']}
2. ListChange{globalId:'my.javers.comparator.ZasFish/', property:'areas', containerChanges:[(2).'my.javers.comparator.ZasCatchArea@7113b13f'>>'my.javers.comparator.ZasCatchArea@45820e51', (1).'my.javers.comparator.ZasCatchArea@42d8062c'>>'my.javers.comparator.ZasCatchArea@6043cd28', (0).'my.javers.comparator.ZasCatchArea@cb51256'>>'my.javers.comparator.ZasCatchArea@59906517']}



package my.javers.comparator;

public class ZasCatchArea {
    String catchArea;

    public String getCatchArea() {
        return catchArea;
    }

    public void setCatchArea(String catchArea) {
        this.catchArea = catchArea;
    }
}

public class ZasCatchZone {
    String catchZone;

    public String getCatchZone() {
        return catchZone;
    }

    public void setCatchZone(String catchZone) {
        this.catchZone = catchZone;
    }
}

public class ZasFish {
    String fischName;
    List<ZasCatchZone> zones = new ArrayList<ZasCatchZone>();
    List<ZasCatchArea> areas = new ArrayList<ZasCatchArea>();

    public String getFischName() {
        return fischName;
    }

    public void setFischName(String fischName) {
        this.fischName = fischName;
    }

    public List<ZasCatchZone> getZones() {
        return zones;
    }

    public void setZones(List<ZasCatchZone> zones) {
        this.zones = zones;
    }

    public List<ZasCatchArea> getAreas() {
        return areas;
    }
    public void setAreas(List<ZasCatchArea> areas) {
        this.areas = areas;
    }
}

public class ZasCatchAreaComparator implements 
CustomPropertyComparator<ZasCatchArea, ValueChange> {

    public ValueChange compare(ZasCatchArea left, ZasCatchArea right, 
                GlobalId affectedCdoId, Property propertyName) {
        if (left.getCatchArea().equals(right.getCatchArea()))
            return null;

        return new ValueChange(affectedCdoId, propertyName.getName(), left, right);
    }

}

public class ZasCatchZoneComparator implements 
CustomPropertyComparator<ZasCatchZone, ValueChange> {

    public ValueChange compare(ZasCatchZone left, ZasCatchZone right, 
                    GlobalId affectedCdoId, Property propertyName) {
        if (left.getCatchZone().equals(right.getCatchZone()))
            return null;

        return new ValueChange(affectedCdoId, propertyName.getName(), left, right);
    }

}

public class MyComparator {

     public static void main(String[] args) {
        Javers javers = JaversBuilder.javers()
            .registerCustomComparator(new ZasCatchAreaComparator(), ZasCatchArea.class)
            .registerCustomComparator(new ZasCatchZoneComparator(), ZasCatchZone.class)
            .withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE).build();

        ZasFish fisch1 = new ZasFish();
        ZasFish fisch2 = new ZasFish();

        ZasCatchZone z1 = new ZasCatchZone();
        z1.setCatchZone("zone1");
        ZasCatchZone z2 = new ZasCatchZone();
        z2.setCatchZone("zone2");
        ZasCatchZone z3 = new ZasCatchZone();
        z3.setCatchZone("zone3");

        fisch1.getZones().add(z1);
        fisch1.getZones().add(z2);
        fisch1.getZones().add(z3);

        ZasCatchArea a1 = new ZasCatchArea();
        a1.setCatchArea("area1");
        ZasCatchArea a2 = new ZasCatchArea();
        a2.setCatchArea("area2");
        ZasCatchArea a3 = new ZasCatchArea();
        a3.setCatchArea("area3");

        fisch1.getAreas().add(a1);
        fisch1.getAreas().add(a2);
        fisch1.getAreas().add(a3);

        ZasCatchZone z4 = new ZasCatchZone();
        z4.setCatchZone("zone3");
        ZasCatchZone z5 = new ZasCatchZone();
        z5.setCatchZone("zone2");
        ZasCatchZone z6 = new ZasCatchZone();
        z6.setCatchZone("zone1");

        fisch2.getZones().add(z4);
        fisch2.getZones().add(z5);
        fisch2.getZones().add(z6);

        ZasCatchArea a4 = new ZasCatchArea();
        a4.setCatchArea("area3");
        ZasCatchArea a5 = new ZasCatchArea();
        a5.setCatchArea("area1");
        ZasCatchArea a6 = new ZasCatchArea();
        a6.setCatchArea("area2");

        fisch2.getAreas().add(a4);
        fisch2.getAreas().add(a5);
        fisch2.getAreas().add(a6);

        Diff diff = javers.compare(fisch1, fisch2);


        System.out.println(diff);

    }

}

共有1个答案

顾俊楚
2023-03-14

我想我为我的问题找到了一个解决方案。如果我像这样注册值和值对象

final Javers javers = JaversBuilder.javers()
            .registerCustomComparator(new ZasCatchAreaComparator(), ZasCatchArea.class)
            .registerCustomComparator(new ZasCatchZoneComparator(), ZasCatchZone.class)
            .registerValue(ZasCatchArea.class).registerValue(ZasCatchZone.class).registerValueObject(ZasFish.class)
            .withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE).build();

然后我就变得不同了

1. ListChange{globalId:'my.javers.comparator.ZasFish/', property:'zones', containerChanges:[(2).'my.javers.comparator.ZasCatchZone@19bef4e5'>>'my.javers.comparator.ZasCatchZone@3f1abed', (1).'my.javers.comparator.ZasCatchZone@e37f307f'>>'my.javers.comparator.ZasCatchZone@2ad1e8a5', (0).'my.javers.comparator.ZasCatchZone@2ccd3209'>>'my.javers.comparator.ZasCatchZone@c0fd1f30']}
2. ListChange{globalId:'my.javers.comparator.ZasFish/', property:'areas', containerChanges:[(2).'my.javers.comparator.ZasCatchArea@48115f4e'>>'my.javers.comparator.ZasCatchArea@a1efa37', (1).'my.javers.comparator.ZasCatchArea@c08d9768'>>'my.javers.comparator.ZasCatchArea@d65a5a2', (0).'my.javers.comparator.ZasCatchArea@bb03583'>>'my.javers.comparator.ZasCatchArea@1ebaaab0']}

由于我没有任何ValueChange在本例中,我可以忽略ListChange->我的列表是相同的。

 类似资料:
  • 我需要比较使用自定义差异侦听器忽略子节点序列和属性列表序列的2个XML: 我的代码适用于: 我找到了一个临时的解决方案(8小时内不能在我自己的问题上添加评论): 我之前用:ElementNameAndAttributeQualifier重写了ElementQualifier,如果我将其更改为RecursiveElementNameAndTextQualifier,我可以得到我想要的结果 还可以使用

  • 问题内容: 我认为那应该是一个非常简单的问题。但是不知何故我无法在Google中找到答案。 假设我有2个字符串列表。第一个包含 “字符串A”和“字符串B” ,第二个包含 “字符串B”和“字符串A” (注意顺序不同)。我想用 JUnit 测试它们,以检查它们是否包含 完全相同的 字符串。 是否有任何断言可以检查忽略顺序的字符串是否相等?对于给定的示例org.junit.Assert.assertEq

  • 我有两个列表,数据相同,但顺序不同。 结果:

  • 当我执行时,结果显然是。但是我想忽略“nullable”参数,不管它是false还是true,如果结构相同,它应该返回。 有可能吗?

  • 问题内容: 假设我有两个xml字符串 如何编写一个比较这两个字符串并忽略元素顺序的测试? 我希望测试尽可能短,没有10行XML解析等的位置。我正在寻找一个简单的断言或类似内容。 我有这个(不起作用) 问题答案: 我原来的答案已经过时了。如果必须再次构建它,我将使用xmlunit 2和xmlunit- matchers。请注意,对于xml单元,不同的顺序始终是“相似”而不是相等。 如果有人仍然不想使

  • 忽略列表显示不需要处理的资源或一类规则建议。 忽略列表显示不需要处理的资源或一类规则建议。当某资源或某类型的建议不需要用户处理时,可以通过忽略或忽略该类建议功能将其显示在忽略列表。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “优化建议/安全检查/忽略列表” 菜单项,进入忽略列表页面。 恢复 当忽略列表中某资源或某规则建议需要用户关注处理时,可以使用恢复功能将其显示在建议列表。