如何比较java中的两个哈希集?

时间:2017-06-04 15:34:13

标签: java collections compare hashset

如何比较java中的两个哈希集?我的第一个哈希集如下所示。

$_

上面的哈希集包含这样的元素。

Noun Parse列表:[java,jsp,book]

第二个哈希集

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

Noun Parse列表:[web,php,java,book]

注意 - 我需要检查两组中是否有相同的名词。如果他们有类似的名词,那么我需要做另一项任务

5 个答案:

答案 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);

    }
}