Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将两个不同集合中的元素配对?_Java_Algorithm_Data Structures - Fatal编程技术网

Java 如何将两个不同集合中的元素配对?

Java 如何将两个不同集合中的元素配对?,java,algorithm,data-structures,Java,Algorithm,Data Structures,如果有两套- set1 - [tag, boLD, Link] set2 - [BOLd, TAG, Badge, foo] 有什么有效的算法可以使元素对像- pairs = [tag, TAG], [boLD, BOLd], [Link, null], [null, Badge], [null, foo] 请注意,配对基于不区分大小写的名称 我希望避免O(N^2),它迭代地查找set1中的所有元素,并查找set2中的元素 编辑:我认为如果我们可以使用三元搜索尝试,来实现符号表,其中键是se

如果有两套-

set1 - [tag, boLD, Link]
set2 - [BOLd, TAG, Badge, foo]
有什么有效的算法可以使元素对像-

pairs = [tag, TAG], [boLD, BOLd], [Link, null], [null, Badge], [null, foo]
请注意,配对基于
不区分大小写的
名称

我希望避免O(N^2),它迭代地查找set1中的所有元素,并查找set2中的元素


编辑:我认为如果我们可以使用
三元搜索尝试
,来实现符号表,其中键是set1中的元素,值是set2中的值。set2最后可以处理剩余的元素。

您只需创建一个HashMap并在两个数组上迭代即可。对于键,可以使用每个字符串的小写表示形式。这应该会给您带来线性运行时复杂性,并且非常容易实现。

您可以在
O(n)
中实现,如果您使用一些支持
O(1)
get操作的数据结构,例如

HashMap set1=newhashmap();
HashMap set2=新的HashMap();
类对{
字符串str1;
字符串str2;
成对(字符串s1、字符串s2){
str1=s1;
str2=s2;
}
}
Set pairs=新的HashSet();
set1.放置(“标记”、“标记”);
set1.put(“粗体”、“粗体”);
set1.put(“链接”、“链接”);
set2.放置(“标记”、“标记”);
set2.put(“粗体”、“粗体”);
set2.放置(“徽章”、“徽章”);
set2.put(“foo”、“foo”);
对于(字符串s:set1.keySet()){
如果(设置2.容器)
pairs.add(新对(set1.get,set2.get));
其他的
add(新对(set1.get,null));
}
对于(字符串s:set2.keySet()){
如果(!set1.containsKey)
pairs.add(新对(null,set2.get);
}
用于(p对:对)
系统输出打印项次(p.str1+“”+p.str2);
列表长度呈线性的简单解决方案(用Python给出,现在懒得编写Java)如下所示:

map1 = {}
for i,e in enumerate(set1):
    s = e.lower()
    map1[s] = i

map2 = {}
for i,e in enumerate(set2):
    s = e.lower()
    map2[s] = i

pairs = []
for i,e in enumerate(set1):
    s = e.lower()
    if s in map2:
        elem = (e, set2[map2[s]])
    else:
        elem = (e, None)
    pairs.append(elem)

for i,e in enumerate(set2):
    s = e.lower()
    if s not in map1:
        pairs.append((None, e))
我还假设输入中没有重复项,即它与另一个集合中的0个或1个单词匹配,并且每个集合中没有大小写不同的同一个单词,因为我不确定您期望的输出是什么


这可能不是最有效的方法,但总体来说似乎还不错,因为它仍然是O(n)。

首先展示一些努力。为什么不告诉我们您到目前为止的想法?好消息是:O(N^2)是最坏情况的上限;-)as集合不支持索引访问,所以很遗憾,您需要查找所有元素!!!想一想还有什么类型的收集/数据结构可能会对您有所帮助。你将从自己玩这些东西中获得更多的好处,而不是得到answer@NeerajJain我同意这份清单。首先,我不会只是把它打印出来。我需要返回一个数据结构,以及如何在任何数据结构中以键的形式显示多个空条目。您可以将值插入到某个数据结构中,而不是打印。请参阅我编辑的文章。转换成小写比写所有可能的大小写身份排列更为切实可行。
map1 = {}
for i,e in enumerate(set1):
    s = e.lower()
    map1[s] = i

map2 = {}
for i,e in enumerate(set2):
    s = e.lower()
    map2[s] = i

pairs = []
for i,e in enumerate(set1):
    s = e.lower()
    if s in map2:
        elem = (e, set2[map2[s]])
    else:
        elem = (e, None)
    pairs.append(elem)

for i,e in enumerate(set2):
    s = e.lower()
    if s not in map1:
        pairs.append((None, e))