Java 比较两个set是否相等
30
10 月

Java 比较两个set是否相等

Java 中没有现成的API来比较两个Set是否相等

1. 解决方案

通过sizecontainsAll方法来判断

package org.xinyo.core.utils;

import java.util.Set;

public class SetUtils {
  public static boolean equals(Set<?> set1, Set<?> set2) {
    if (set1 == null || set2 == null) {//set为空,结束程序
      return false;
    }
    if (set1.size() != set2.size()) {//大小不匹配,结束程序
      return false;
    }
    return set1.containsAll(set2);//大小匹配,且set1包含set2所有元素
  }
}

2. Unit Test测试

package org.xinyo.core.utils;

import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

public class TestSetUtils {

  @Test
  public void test1() {

    Set test1 = new HashSet<>();
    test1.add("a");
    test1.add("b");

    Set test2 = new HashSet<>();
    test2.add("b");
    test2.add("c");

    assertThat(SetUtils.equals(test1, test2), is(false));

  }

  @Test
  public void test2() {

    Set test1 = new HashSet<>();
    test1.add("a");
    test1.add("b");

    Set test2 = new HashSet<>();
    test2.add("a");
    test2.add("b");
    test2.add("c");

    assertThat(SetUtils.equals(test1, test2), is(false));

  }

  @Test
  public void test3() {

    Set test1 = new HashSet<>();
    test1.add("a");
    test1.add("b");
    test1.add("c");

    Set test2 = new HashSet<>();
    test2.add("a");
    test2.add("b");

    assertThat(SetUtils.equals(test1, test2), is(false));

  }

  // set ignore sequence
  @Test
  public void test4() {

    Set test1 = new HashSet<>();
    test1.add("a");
    test1.add("b");

    Set test2 = new HashSet<>();
    test2.add("b");
    test2.add("a");

    assertThat(SetUtils.equals(test1, test2), is(true));

  }

  @Test
  public void test5() {

    Set test1 = new HashSet<>();
    test1.add("a");

    Set test2 = new HashSet<>();
    test2.add("a");

    assertThat(SetUtils.equals(test1, test2), is(true));

  }

}

测试结果均通过。