【问题标题】:Checking whether intersection of two lists is valid, returning intersection itself not necessary检查两个列表的交集是否有效,不需要返回交集本身
【发布时间】:2014-11-06 19:08:21
【问题描述】:

我有两个列表(List1 和 List2),其中包含 Column 类型的对象。 Column 有两个私有变量 - Name 和 Type。 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 的交集 = { Column (name = "A", type = "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 的无效交集 = { Column (name = "A", type = "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());
                    }
                }
            }
        }

【问题讨论】:

  • 你不能使用集合吗? This可以帮助你。
  • 不会设置交集只给我一个正确的交集而不列出名称相同但类型不同的列吗?
  • @user503413 该链接上的解决方案是 O(N^2)。

标签: java performance algorithm


【解决方案1】:

list1 中的所有元素放入HashMap 索引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 为空,那么您就赢了。如果您不关心细节,请尽早返回,而不是处理剩余的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2019-03-16
    • 2017-07-07
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2013-10-12
    相关资源
    最近更新 更多