从java中的集合中删除重复元素

Man*_*hah 10 java set

我有一组字符串数组,我想从这里删除重复的元素...

    String[] arr1 = {"a1","b1"};
    String[] arr2 = {"a2","b2"};
    Set<String[]> mySet = new HashSet<String[]>();
    mySet.add(arr1);
    mySet.add(arr2);
    mySet.add(new String[] {"a1","b1"});
    System.out.print(mySet.size());
Run Code Online (Sandbox Code Playgroud)

目前mySet看起来像这样:

[{"a1","b1"},{"a2","b2"},{"a1","b1"}]
Run Code Online (Sandbox Code Playgroud)

但我想这样:

[{"a1","b1"},{"a2","b2"}]
Run Code Online (Sandbox Code Playgroud)

我知道一些方法......

  1. 每次我需要运行内部循环并检查它是否重复.
  2. 我可以覆盖该集的行为吗?(哈希码或等号)?( 我不知道怎么....)
  3. 我需要为此更改数据结构吗?(linkedhashset或list或任何其他合适的数据结构?)

c.P*_*.u1 11

数组继承自Object,不会覆盖hashCodeequals方法.A HashSet使用Map实现,而实现又使用hashCodeequals避免重复元素.

您可以使用TreeSet自定义Comparator来比较String数组是否相等.

Set<String[]> mySet = new TreeSet<>(new Comparator<String[]>() {

  @Override
  public int compare(String[] o1, String[] o2) {
    return Arrays.equals(o1, o2)? 0 : Arrays.hashCode(o1) - Arrays.hashCode(o2);
  }

});
Run Code Online (Sandbox Code Playgroud)

请注意,这只会忽略具有相同对应元素的重复数组.如果元素的顺序不同,则不会将其视为重复.

如果您希望能够丢弃无序重复项,例如,{a1, b1}{b1, a1},请使用:

@Override
public int compare(String[] o1, String[] o2) {
    int comparedHash = o1.hashCode() - o2.hashCode();
    if(o1.length != o2.length) return comparedHash;
    List<String> list = Arrays.asList(o1);
    for(String s : o2) {
        if(!list.contains(s)) return comparedHash;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


bco*_*rso 10

所述array散列码是独立的的内容array(它继承的Object哈希码,它使用阵列的参照).

但是,List会做你想要的.它使用基于中的元素的哈希码List.来自Java Docs:

int hashCode = 1;
for (E e : list)
    hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Run Code Online (Sandbox Code Playgroud)

例:

List<String> list1 = Arrays.asList("a1","b1");
List<String> list2 = Arrays.asList("a2","b2");
Set<List<String>> mySet = new HashSet<List<String>>();
mySet.add(list1);
mySet.add(list2);
mySet.add(Arrays.asList("a1","b1"));   // duplicate won't be added
System.out.print(mySet.size());        // size = 2
Run Code Online (Sandbox Code Playgroud)