【问题标题】:How to compare two hash sets in java?如何比较java中的两个哈希集?
【发布时间】:2017-06-04 15:34:12
【问题描述】:

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

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

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

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

第二个哈希集

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

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

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

【问题讨论】:

  • 你想要什么结果?
  • 定义“比较”。你在寻找交叉点吗?或者两组都具有完全相同的元素?另外,到目前为止,您尝试过什么?
  • seta.equals( setb ) 有什么问题?
  • 现在定义“相似”。并阅读 api 文档:docs.oracle.com/javase/8/docs/api/java/util/…
  • 是的,是的,是的——但如果不是“等于”,那么“相似”是什么?还是等于IgnoreCase?还是类似于“bug”的“bee”之类的奇怪东西?

标签: java collections compare hashset


【解决方案1】:

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

Set#equals() 以您期望的方式比较集合:

set1.equals(set2)

如果您希望两个都为 null 的 Set 变量“相等”,则使用:

Objects.equals(set1, set2)

【讨论】:

  • @NextDeveloper 不,它不比较顺序。 Object.equals() 调用传递给它的实例的 equals 方法,而 Set 的 equals() 实现不考虑顺序,主要是因为 Set 不支持顺序 - 它实际上不可能考虑顺序。
【解决方案2】:

如果你想找到共同元素,那么使用 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");

【讨论】:

  • 您可以只使用anyMatch(),而不是过滤和使用count()。它会在第一场比赛停止,因此会更快(更清晰)。
  • 你把 count() 放在那里了。 anyMatch() 返回一个布尔值。
【解决方案3】:

通过使用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  ");
        }

    }

}

【讨论】:

    【解决方案4】:

    所以你的意思是这样的?

    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,书]名词解析列表:[Java,developmet,web,JSP,书]他们有 - 书
    • 我不明白你的问题。你得到什么输出?使用我的代码,book 和 java 都打印出来了。
    • 当我运行我的代码时...我得到这样的输出i.imgur.com/9FAInxu.png
    • 您好,先生,我发现了问题。因为我的集合元素之一是大写字母,另一个是混合大小写。所以它只显示匹配大小写的单词。例如 - 在两个数组中,“book”是相似的。
    • “书”和“书”有必要匹配吗?如果是这样,只需先将临时集中的所有字符串转换为大写(或小写)即可。
    【解决方案5】:
    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);
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多