我想在集合中添加重复的元素,我该怎么办?我必须重写的方法是什么。
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));
}
}
答案 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);
}
}
}
我认为这对您有用。