Java HashSet相对于ArrayList的优势,反之亦然
我对Java中的数据结构有疑问。在Java中解决一个典型的散列问题时,我使用了Java HashSet相对于ArrayList的优势,反之亦然,java,arraylist,hashset,Java,Arraylist,Hashset,我对Java中的数据结构有疑问。在Java中解决一个典型的散列问题时,我使用了散列集数据结构,在出现重复对象(对象内容)之前,该结构工作正常。因为HashSet不支持插入重复项,所以我的逻辑失败了 我将hashset替换为典型的Arraylist,因为hashset的方法,如.add()、.contains()、.remove()在这两种方法中都受支持,并且我的逻辑工作得很好 但这是否一定意味着当涉及重复项时,ArrayList是Hashset的逻辑选择?Hashset与ArrayList相比应
散列集
数据结构,在出现重复对象(对象内容)之前,该结构工作正常。因为HashSet不支持插入重复项,所以我的逻辑失败了
我将hashset替换为典型的Arraylist
,因为hashset的方法,如.add()、.contains()、.remove()在这两种方法中都受支持,并且我的逻辑工作得很好
但这是否一定意味着当涉及重复项时,ArrayList是Hashset的逻辑选择?Hashset与ArrayList相比应该有一些时间复杂性优势,对吗?有人能给我一些关于这方面的见解吗
编辑:当涉及重复项时,如果要进行哈希运算,理想的数据结构是什么。我的意思是不应忽略重复项,而应插入重复项。- 使用HashMap时,它会用新的副本替换原始值
- 使用哈希集时,将忽略(不插入)后续重复项
- 使用ArrayList时,它只是将副本添加到列表的末尾
- 使用HashMap时,它会用新的副本替换原始值
- 使用哈希集时,将忽略(不插入)后续重复项
- 使用ArrayList时,它只是将副本添加到列表的末尾
这一切都取决于您的需求。
ArrayList
如果您不想重复,那么它就不是合乎逻辑的选择。针对不同的用例使用不同的工具
您可以在重复项没有意义的区域使用
集合
,例如,一组学生。列表
允许重复。ArrayList
如果您不希望重复,则不符合逻辑。针对不同的用例使用不同的工具
您可以在重复项没有意义的区域使用
集合
,例如,一组学生。列表允许重复。不清楚您所说的“哈希问题”是什么意思,但可能您正在寻找一个解决方案。从番石榴中:
支持顺序独立相等的集合,如Set,但可能有重复的元素。多集有时也称为包
多集合中彼此相等的元素称为同一单个元素的引用。一个元素在多集合中出现的总数称为该元素的计数(术语“频率”和“多重性”是等效的,但在本API中未使用)
JDK中不存在这样的问题。不清楚“哈希问题”是什么意思,但可能您正在寻找一个解决方案。从番石榴中:
支持顺序独立相等的集合,如Set,但可能有重复的元素。多集有时也称为包
多集合中彼此相等的元素称为同一单个元素的引用。一个元素在多集合中出现的总数称为该元素的计数(术语“频率”和“多重性”是等效的,但在本API中未使用)
JDK中不存在这样的东西。如果您特别需要处理重复项的HashSet
,那么HashMap
将能够完成这项工作。如果您只需要计算添加的对象数量(使用快速查找/etc),则理想的方法是使用HashMap
,其中T
是对象的类型。如果您确实需要保留对已添加的重复对象的引用,请使用HashMap
。通过这种方式,您可以使用HashMap的.containsKey(T)
进行查找,并迭代结果列表中所有类似的哈希对象。例如,您可以创建以下类:
public class HashSetWithDuplicates<T> {
private HashMap<T, List<T>> entries;
private int size;
public HashSetWithDuplicates(){
entries = new HashMap<>();
size = 0;
}
public HashSetWithDuplicates(Collection<? extends T> col){
this();
for(T t : col){
add(t);
}
}
public boolean contains(T t){
return entries.containsKey(t);
}
public List<T> get(T t){
return entries.get(t);
}
public void add(T t){
if (!contains(t)) entries.put(t, new ArrayList<>());
entries.get(t).add(t);
size++;
}
public void remove(T t){
if (!contains(t)) return;
entries.get(t).remove(t);
if(entries.get(t).isEmpty()) entries.remove(t);
size--;
}
public int size(){
return size;
}
public boolean isEmpty(){
return size() == 0;
}
}
具有重复项的公共类哈希集{
私有HashMap条目;
私有整数大小;
公共HashSetWithDuplicates(){
entries=newhashmap();
尺寸=0;
}
公共HashSetWithDuplicates(Collection如果您特别需要处理重复项的HashSet
,则HashMap
将能够完成此任务。如果您只需要计算添加的对象数(使用快速查找/etc),一个HashMap
将是理想的,其中T
是您的对象的类型。如果您确实需要保留对已添加的重复对象的引用,请使用HashMap
。这样您就可以使用HashMap的进行查找。containsKey(T)
,并遍历结果列表中所有类似的哈希对象。例如,您可以创建以下类:
public class HashSetWithDuplicates<T> {
private HashMap<T, List<T>> entries;
private int size;
public HashSetWithDuplicates(){
entries = new HashMap<>();
size = 0;
}
public HashSetWithDuplicates(Collection<? extends T> col){
this();
for(T t : col){
add(t);
}
}
public boolean contains(T t){
return entries.containsKey(t);
}
public List<T> get(T t){
return entries.get(t);
}
public void add(T t){
if (!contains(t)) entries.put(t, new ArrayList<>());
entries.get(t).add(t);
size++;
}
public void remove(T t){
if (!contains(t)) return;
entries.get(t).remove(t);
if(entries.get(t).isEmpty()) entries.remove(t);
size--;
}
public int size(){
return size;
}
public boolean isEmpty(){
return size() == 0;
}
}
具有重复项的公共类哈希集{
私有HashMap条目;
私有整数大小;
公共HashSetWithDuplicates(){
entries=newhashmap();
尺寸=0;
}
公共HashSetWithDuplicates(CollectionBut Hashset在哈希要求方面比arraylist有一些时间复杂度优势,对吗?否则,当您可以使用arraylist实现同样的要求时,为什么需要Hashset?为了简单起见…如果您需要确保不允许重复,为什么要使用arraylist?请参阅我的编辑。我希望重复项可以被删除。)e inserted,不应被忽略。通过散列,我猜您希望能够通过其散列值来识别对象?不管怎样,我怀疑您想要的是arraylist,但在散列要求方面,Hashset比arraylist具有一些时间复杂度优势,对吗?否则,当您可以实现相同的usin时,为什么需要Hashsetg arraylist?为了简单起见…如果您需要确保不允许重复,为什么要使用arraylist?请参阅我的编辑。我希望重复项