检查两个列表的交集是否有效,不需要返回交集

时间:2014-09-12 14:51:30

标签: java performance algorithm

我有两个包含Column类型对象的列表(List1和List2)。列有两个私有变量 - 名称和类型。 List1和List2的交集由Column的名称完成。例如:

List1 = { Column (name = "A", type = "STRING"), Column (name = "B", type = "INT") }
List2 = { Column (name = "A", type = "STRING"), Column (name = "D", type = "INT") } 

然后List1和List2的交集= {列(名称=" A",类型=" STRING")}

如何在不使用双for循环(O(n ^ 2))的情况下有效地在Java 8中编写代码来检查交集是否有效(如果它是无效的,那么我想知道沿着列的名称有冲突的类型,如果有效,只返回True对我来说足够好 - 我不需要交叉本身)。有效交集定义如下:通过比较字段名称完成的交集中的列必须具有相同的类型。例如,以下内容无效:

List1 = { Column (name = "A", type = "STRING"), Column (name = "B", type = "INT") }
List2 = { Column (name = "A", type = "INT"), Column (name = "D", type = "INT") } 

然后List1和List2的无效交集= {列(名称=" A",类型=" STRING")} 因为类型不匹配。另一种思考方式是 给定List1中的列列表和List2中的列列表,我想检查List1和List2中的列是否具有相同的类型。

首次尝试:

 for (final Column newColumn : newMySQLTableMetaData.getColumns()) {
            for (final Column originalColumn : originalMySQLTableMetaData.getColumns()) {
                if (newColumn.getName().equals(originalColumn.getName())) {
                    if (!newColumn.getType().equals(ColumnTypeConverter.toLogicalColumnType(originalColumn.getType()))) {
                        throw new UploadException("The column types have a mismatch. Original column" +
                                " named " + originalColumn.getName() + " a type of " + originalColumn.getType().toString() + " " +
                                "while new column with the same name has a type of " + newColumn.getType().toString());
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:2)

list1HashMap中的所有元素放入name索引中。抛出第二个列表,看看是否有第一个匹配的列(每个元素O(1))。如果是,请检查是否存在冲突。

private List<String> conflictList = new ArrayList<String>();

private final Map<String, Column> map = new HashMap<>();
for (Column c1: list1) map.put(c1.name, c1);
for (Column c2: list2) {
    Column c1 = map.put(c2.name, c2);
    if (c1==null) continue;
    if (c1.type.equals(c2.type)) continue;
    conflictList.add(c1); // or add the name only or both elements or whatever
}

如果conflictList为空,那么您就赢了。如果您不关心细节,请尽早返回,而不是处理剩余的元素。