【问题标题】:Java: Compare two ArrayLists which containing inner ArrayListsJava:比较两个包含内部 ArrayLists 的 ArrayLists
【发布时间】:2013-12-05 03:25:23
【问题描述】:

我有两个 ArrayList,其中又包含 Hardware 类型的 ArrayList:

private ArrayList<ArrayList<Hardware>> list1;
private ArrayList<ArrayList<Hardware>> list2;

Hardware 类包含一个 ElementType 枚举,它决定了 Hardware 的类型:

enum ElementType{
    Microcontroller;
    Core;
    Memory;
    Sensor;
    Pin;
    Port;
}

list1 的示例,其中包含 3 个硬件类型的 ArrayList:

[Microcontroller, Memory]
[Port]
[Pin]

list2 的示例,其中包含 6 个硬件类型的 ArrayList:

[Microcontroller, Memory]
[Microcontroller, Memory]
[Microcontroller, Port]
[Microcontroller, Core]
[Sensor]
[Pin]

现在我想检查列表 1 的所有 ArrayList 是否都包含在 list2 中并且具有相同的顺序:

这将是有效的:

[Microcontroller, Memory, Core] == [Microcontroller, Memory, Core]

虽然这将具有不同的顺序,因此无效:

[Microcontroller, Memory, Core] == [Microcontroller, Core, Memory]

最后,我需要知道 list1 的所有 ArrayList 是否也在 list2 中的顺序相同,以及 list2 中的哪一个。

我为此苦苦挣扎了一段时间,因为我不知道如何为此使用 Collection 的辅助方法,而且我对使用循环的第一个想法非常糟糕并没有帮助我:

private void check() {
    for (ArrayList<Hardware> listOf1 : list1) {
        for (Hardware abstHw : listOf1) {
            System.out.println(abstHw);
                    ????????????
        }
    }   
}

谁能帮我解决这个问题或给我一些方便的提示?

干杯, 菲尔

-------编辑---------------

澄清一下:

list1 和 list2 的硬件实例不一样!它们只能通过 ElementType 进行比较。

【问题讨论】:

    标签: java algorithm collections arraylist comparison


    【解决方案1】:

    你知道,你想要的其实很简单:

    private void check() {
        return list2.containsAll(list1);
    }
    

    事实上,如果就这么简单,您可能不需要单独的方法。

    【讨论】:

    • 这看起来很简单,其实不然。使用有一个 ArrayList 的 ArrayList 并且为了比较你需要循环然后调用 containsAll
    • @GV 你错了。子数组列表通过containsAllequals 进行比较,这正是我们想要的。
    • 它还会比较包含的对象,这些对象是 HardwareElement 的实例。两个Lists包含不同的对象,只有ElementType可以相同
    【解决方案2】:

    您可以为此使用List#retainAll()

    private ArrayList<ArrayList<Hardware>> list1;
    private ArrayList<ArrayList<Hardware>> list2;
    list2.retainAll(list1);
    

    交叉点中的元素列表(list2 在执行List#retainAll() 之后)就是您要查找的内容。如果两个内部列表具有相同的对象,但顺序不同,则不会被视为相同,因此您不必明确担心这一点。

    注意:List#retainAll() 将修改实际的 list1 对象。如果您需要保留它,请在执行此操作之前制作一份副本。

    【讨论】:

    • 在我的回答中查看 cmets。
    • 对象不一样。它们可以通过它们的 ElementType (Enum) 进行比较。
    • @ph09 是否可以在Hardware 中覆盖equals
    • 不幸的是,这些类是由 EMF(Eclipse 建模框架)生成的,我想避免更改它们。 equal 方法应该如何工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2017-07-26
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多