如何在Set中添加重复元素?

时间:2019-06-19 05:28:49

标签: java

我想在集合中添加重复的元素,我该怎么办?我必须重写的方法是什么。

    public final class AddDupliacateElementInSet
    {
         public static void main(String[] args)
         {
             Set<Integer> set =new HashSet<>();
             set.add(1);
             set.add(1);
             set.add(3);
             set.add(4);
             set.add(5);
             set.add(6);
             set.forEach(s->System.out.println(s));  
         }
    }

4 个答案:

答案 0 :(得分:5)

正如社区在评论中指出的那样,import { globalFilter } from './mixins/filtersMixins' 并不意味着存储重复的值。但是由于诸如“面试问题”或“您无法更改的库代码”之类的原因,您可以通过覆盖Set始终返回equals来强制其存储重复项。

对于不受您控制的原语或其他对象,您可以围绕值对象创建包装器类,并使其false始终返回equals()

false

然后使用它:

public class UnequalWrapper {

    private int value;

    //...constructor, getter, setter

    @Override
    public boolean equals(Object o) {
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(value);
    }
}

输出:

public static void main(String[] args) {
    UnequalWrapper a = new UnequalWrapper(1);
    UnequalWrapper b = new UnequalWrapper(2);
    UnequalWrapper c = new UnequalWrapper(1);

    Set<UnequalWrapper> set = Set.of(a, b, c);
    set.forEach(wrapper -> System.out.println(wrapper.getValue()));
}

但是,再次不推荐,请勿在家尝试!

编辑:
如果使用包装器,则可以省略1 2 1 equals()。这是因为hashcode()类的方法将检查对象引用,如果您每次都创建一个新的包装实例,则将有所不同。

答案 1 :(得分:2)

Java集合中的任何Set实现都不允许这样做。

考虑使用 Apache Commons Collections 中的MultiSet

import org.apache.commons.collections4.MultiSet;
import org.apache.commons.collections4.multiset.HashMultiSet;

public class Test {
  public static void main(String[] args) {
    MultiSet<Integer> set = new HashMultiSet<>();
    set.add(1);
    set.add(1);
    set.add(3);
    set.add(4);
    set.add(5);
    set.add(6);
    set.forEach(s -> System.out.println(s));
  }
}

结果:

1
1
3
4
5
6

答案 2 :(得分:1)

从oracle docs中,集合是一个不包含重复元素的集合。 要允许重复的元素,可以使用Bags or Multisets,它们是可能包含重复元素的无序集合。

您还可以从此StackOverflow帖子reasons-for-using-a-bag-in-java

中获取更多信息

答案 3 :(得分:1)

我们可以在Set中添加重复的元素,如下所示。

首先创建一个包含以下要放入HashSet中的属性的类。

公共类值{

int number;

}

然后,从此类创建任意数量的实例,然后将所需的值分配给该属性。最后,将所有实例添加到HashSet中。看下面的示例代码。

公共类JavaApplication22 {

public static void main(String[] args) {
    Set<Value> numberSet = new HashSet<>();
    Value obj1 = new Value();
    obj1.number = 1;
    Value obj2 = new Value();
    obj2.number = 2;
    Value obj3 = new Value();
    obj3.number = 1;
    Value obj4 = new Value();
    obj4.number = 2;

    numberSet.add(obj1);
    numberSet.add(obj2);
    numberSet.add(obj3);
    numberSet.add(obj4);

    Iterator<Value> itr = numberSet.iterator();
    while(itr.hasNext()){
        System.out.println(itr.next().number);
    }
}

}

我认为这对您有用。