首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查两个列表的交集是否有效,返回交本身不需要。

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

Stack Overflow用户
提问于 2014-09-12 14:51:29
回答 1查看 120关注 0票数 1

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

代码语言:javascript
复制
List1 = { Column (name = "A", type = "STRING"), Column (name = "B", type = "INT") }
List2 = { Column (name = "A", type = "STRING"), Column (name = "D", type = "INT") } 

然后List1和List2 ={列(name = "A",type = "STRING")的交集}

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

代码语言:javascript
复制
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中的列是否具有相同的类型。

第一次尝试:

代码语言:javascript
复制
 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());
                    }
                }
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-12 14:56:33

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

代码语言:javascript
复制
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是空的,那么你就赢了。如果您不关心细节,请尽早返回,而不是处理其余的元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25811077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档