如何比较java中的两个哈希集?我的第一个哈希集如下所示。
$_
上面的哈希集包含这样的元素。
Noun Parse列表:[java,jsp,book]
第二个哈希集
static Set<String> nounPhrases = new HashSet<>();
Noun Parse列表:[web,php,java,book]
注意 - 我需要检查两组中是否有相同的名词。如果他们有类似的名词,那么我需要做另一项任务
答案 0 :(得分:0)
你的意思是这样吗?
public static void main(String[] args) {
final Set<String> nounPhrases = new HashSet<>();
nounPhrases.add("java");
nounPhrases.add("jsp");
nounPhrases.add("book");
final Set<String> nounPhrases2 = new HashSet<>();
nounPhrases2.add("web");
nounPhrases2.add("php");
nounPhrases2.add("java");
nounPhrases2.add("book");
// Checking for every element in first set
for (final String element : nounPhrases) {
// if second set has the current element
if (nounPhrases2.contains(element)) {
System.out.println("They have " + element);
}
}
}
我的输出:
They have java
They have book
编辑: 根据您的评论,如果我理解正确,如果您想获得两个集合中的公共元素,只需存储值并返回它们:
public static void main(String[] args) {
final Set<String> nounPhrases = new HashSet<>();
nounPhrases.add("java");
nounPhrases.add("jsp");
nounPhrases.add("book");
final Set<String> nounPhrases2 = new HashSet<>();
nounPhrases2.add("web");
nounPhrases2.add("php");
nounPhrases2.add("java");
nounPhrases2.add("book");
System.out.println(getCommon(nounPhrases, nounPhrases2));
}
public final static Set<String> getCommon(Set<String> setA, Set<String> setB) {
final Set<String> result = new HashSet<>();
for (final String element : setA) {
if (setB.contains(element)) {
result.add(element);
}
}
return result;
}
您可以使用泛型使该方法适用于除字符串之外的其他元素:
public final static <T> Set<T> getCommon(Set<T> setA, Set<T> setB) {
final Set<T> result = new HashSet<>();
for (final T element : setA) {
if (setB.contains(element)) {
result.add(element);
}
}
return result;
}
如果性能很重要,则应首先检查大小,然后仅迭代较小集合的元素。如果你有一个带有1个元素的集合,而有一个带有100个集合,那么从较小的集合开始将为你带来一次迭代,而从较大的集合开始将为你留下100个检查,其中只有1个可以在两个集合中。
答案 1 :(得分:0)
如果你想找到公共元素,那么使用collect(Collectors.toList())而不是count,如果你想简单地找到有多少set使用java 8的公共元素
long count = nounPhrases.stream().filter(tempstring -> {
return nounPhrases2.stream().anyMatch(tempstring2 -> {
return tempstring.equals(tempstring2);
});
}).count();
if (count > 0)
System.out.println("has common elements-"+count);
else
System.out.println("not common");
答案 2 :(得分:0)
通过使用Java apache.commons.collections包,我们可以实现
package com.StackoverFlow;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set hs_1 = new HashSet();
hs_1.add("A");
hs_1.add("B");
hs_1.add("C");
hs_1.add("D");
Set hs_2 = new HashSet();
hs_2.add("A");
hs_2.add("B");
hs_2.add("C");
hs_2.add("D");
Collection result = CollectionUtils.subtract(hs_1, hs_2);
System.out.println(result);
if(result.isEmpty()){
System.out.println("perform Task-->>Value maches ");
}else{
System.out.println("perform Task-->>Value not maches ");
}
}
}
答案 3 :(得分:0)
这是一个已经发明的车轮。
Set#equals()
以您期望的方式比较集合:
set1.equals(set2)
如果您想要两个都为null的Set变量为“相等”,则使用:
Objects.equals(set1, set2)
答案 4 :(得分:-1)
public class SetUtils {
public static boolean equals(Set<?> set1, Set<?> set2){
if(set1 == null || set2 ==null){
return false;
}
if(set1.size()!=set2.size()){
return false;
}
return set1.containsAll(set2);
}
}