如何在Java中比较两个哈希集合?

3
如何在Java中比较两个哈希集?我的第一个哈希集如下所示。
static Set<String> nounPhrases = new HashSet<>();

上述哈希集包含以下元素。

名词解析列表:[java,jsp,book]

第二个哈希集

static Set<String> nounPhrases2 = new HashSet<>();

名词解析列表:[网页,PHP,Java,书籍]

注意 - 我需要检查两个集合中是否有相同的名词。如果它们有相似的名词,那么我需要执行另一个任务。


1
你想要什么样的结果? - Sweeper
4
定义“compare”。您是否在寻找交集?还是要求两个集合具有完全相同的元素?此外,您尝试过什么? 定义“compare” :比较。您是否寻求交集?还是要求两个集合拥有完全相同的元素?此外,您已经尝试了什么? - Jonathan Sudiaman
1
seta.equals(setb)有什么问题? - laune
3
请定义"similar"的含义,并阅读API文档:https://docs.oracle.com/javase/8/docs/api/java/util/Set.html#retainAll-java.util.Collection- - JB Nizet
3
是的,是的,是的——但如果它不是“相等”,那么“相似”是什么?或者equalsIgnoreCase呢?还是像“bee”类似于“bug”这样奇怪的东西? - laune
显示剩余6条评论
4个回答

6

这是一个已经发明的轮子。

Set#equals()按照你所期望的方式比较集合:

set1.equals(set2)

如果你想让两个都是 null 的 Set 变量“相等”,那么请使用以下代码:
Objects.equals(set1, set2)

1
@NextDeveloper 不,它不比较顺序。Object.equals() 调用传递给它的实例的 equals 方法,而 Set 的 equals() 实现不考虑顺序,主要是因为 Set 不支持顺序 - 它实际上无法考虑顺序。 - Bohemian

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个元素可能同时存在于两个集合中。


你好,我得到了以下输出。如何显示所有相同的元素?名词解析列表:[java, jsp, book] 名词解析列表:[Java, developmet, web, JSP, book] 它们有 - book - user8048032
我不明白你的问题。你得到了什么输出?根据我的代码,book和java都被打印出来了。 - Dennux
当我运行我的代码时...我得到的输出是这个 http://i.imgur.com/9FAInxu.png - user8048032
先生您好,我找到了问题所在。因为我的一个集合元素是大写字母,而另一个是大小写混合的,所以它只显示具有相同大小写的单词。例如,在两个数组中,“book”是相似的。 - user8048032
你是否需要"book"和"Book"匹配?如果是的话,只需先将所有字符串转换为大写(或小写)放入临时集合中。 - Dennux

0
如果你想找到共同的元素,使用collect(Collectors.toList())而不是count。如果你只想简单地找出有多少个集合有共同的元素,可以使用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");

不必使用过滤和 count(),你可以直接使用 anyMatch()。它会在第一个匹配时停止,并且速度更快(也更清晰)。 - JB Nizet
你把count()留在那里了。anyMatch()返回一个布尔值。 - JB Nizet

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  ");
        }

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接