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

如果两个列表有相同的元素和相同的“相对”顺序,如何比较它们使它们相等?

金晨
2023-03-14

根据逻辑,我需要实现两个List,如果它们以相同的“相对”顺序具有相同的元素,则它们被认为是相等的。

举个例子,以下一对列表被认为彼此相等:

[0, 1, 2, 3]
[2, 3, 0, 1]

[C, F, B, A]
[F, B, A, C]

只要遵守相对顺序,就可以认为它们是平等的。

作为反例,这两个不相等:

[A, B, C, D]
[C, A, D, B]

导致 AD 交换到位。

所以,基本上我发现这很有挑战性,因为这不是顺序完全重要的情况,也不是顺序完全不重要的情况。在这种情况下,我会使用普通的< code>list1.equals(list2)方法,或者在另一种情况下通过< code>Set对象传递。

现在,我已经考虑了一个“虚拟”方法:

>

  • 通过Set检查2个列表的组成。

    如果它们由相同的元素组成,请检查相对顺序,如下所示:

    • 遍历list2,直到找到位于list1第一个位置的元素;
    • 考虑到我可能会使用mod函数从list2中的索引0开始,逐个元素检查它们是否处于相同的相对顺序。

    希望在Java中已经有了开箱即用的更有效率的东西来完成我正在做的事情。

    提前感谢任何回答:)

  • 共有1个答案

    景星华
    2023-03-14

    诚然,我并没有涵盖所有的可能性,但这可能会奏效。首先比较尺寸。如果相等,则将一个列表附加到自身,并查看第一个列表是否是该列表的子列表。我使用字符串,但可能有一种更有效的方法。值得思考的事情。

    List<Integer> list1 = List.of(1, 2, 3, 4);
    List<Integer> list2 = new ArrayList<>(List.of(3, 4, 1, 2));
    
    if (list1.size() == list2.size()) {
        list2.addAll(list2);
        String s2 = list2.stream().map(String::valueOf).collect(Collectors.joining());
        String s1 = list1.stream().map(String::valueOf).collect(Collectors.joining());
        if (s2.contains(s1)) {
            System.out.println("Lists are equal");
            return;
        }
    }
    System.out.println("Lists are not equal");
    

    指纹

    Lists are equal
    
    
     类似资料:
    • 问题内容: 我如何测试python中两个JSON对象是否相等,而忽略列表的顺序? 例如 … JSON文档 a : JSON文档 b : 并且即使列表的顺序不同,也应该比较相等。 问题答案: 如果要使两个具有相同元素但顺序不同的对象相等,那么显而易见的事情是比较它们的排序后的副本-例如,以JSON字符串和表示的字典: …但这是行不通的,因为在每种情况下,顶层dict的项都是具有相同元素的列表,但是顺

    • 问题内容: 我如何测试python中两个JSON对象是否相等,而忽略列表的顺序? 例如 … JSON文档a: JSON文档b: 并且应该比较相等,即使列表的顺序不同。 问题答案: 如果你想要两个具有相同元素但顺序不同的对象相等,那么显而易见的事情是比较它们的排序后的副本-例如,以JSON字符串和表示的字典: …但这是行不通的,因为在每种情况下,”errors”顶层dict的项都是具有相同元素的列表

    • 问题内容: 语境 我正在为该类编写一个简单的 JUnit 测试。 阿可以从静态工厂方法,需要一个可变参数的创建 字符串 。 在的存在期间的任何时间,客户端可以检查它通过在的形式创建的参数 列表 ,通过方法。 换句话说,a 既记住并公开了使之成为现实的参数列表。有关此合同的更多详细信息: 的顺序将与为对象创建选择的顺序相同 允许重复的后续 String 组件并按顺序保留 行为未定义(其他代码保证没有

    • 我的数据库中有两个表,这些表具有相同的精确列和数据类型,但顺序不同。 表A有列:A、B、C、D。 表B有以下列:A、C、D、B。 我有一个使用JooQ查询数据库的应用程序,它利用Codigen来创建表格和记录。但是,由于编译错误,它不允许我合并两个选择语句。我能做什么,把两张桌子合并起来? 在union函数内部的变量上,它与SelectUnionStep中的类型不匹配有关。关于union(ARec

    • 问题内容: 这样的情况有效吗? 问题答案: 没有。 元素ID在整个文档中应该是唯一的。

    • 的顺序将与为创建对象选择的顺序相同 允许重复的后续字符串组件并按顺序保留 未定义的行为(其他代码保证没有进入工厂) 在对象实例化之后,没有任何方法可以更改组件列表 我正在编写一个简单的测试,该测试从字符串列表创建并检查它是否可以通过返回相同的列表。我立即这样做,但这应该发生在一个现实的代码路径的远处。 这里是我的尝试: null null