在Java中从哈希集中删除对象

在Java中从哈希集中删除对象,java,Java,我有一个包含10个对象的哈希集,如何删除其中一个?这就是代码,现在我需要创建一个方法来删除一块“比萨饼” 将从哈希集中删除一个“切片”。如果您没有办法创建一个与其他切片相等的切片,并且不将切片存储在任何其他数据结构中,那么使用哈希集没有多大意义 在您的例子中,构造函数中没有参数可以帮助区分一个切片,这意味着所有切片都是相等的,或者所有切片都是成对不同的。这意味着集合最多包含一个切片(在本例中使用clear()),或者如果不迭代集合,就无法再次找到切片 在这种情况下,这使得HashSet只是一个相

我有一个包含10个对象的哈希集,如何删除其中一个?这就是代码,现在我需要创建一个方法来删除一块“比萨饼”


将从哈希集中删除一个“切片”。

如果您没有办法创建一个与其他
切片
相等的
切片,并且不将切片存储在任何其他数据结构中,那么使用
哈希集
没有多大意义

在您的例子中,构造函数中没有参数可以帮助区分一个
切片
,这意味着所有切片都是相等的,或者所有切片都是成对不同的。这意味着集合最多包含一个切片(在本例中使用
clear()
),或者如果不迭代
集合
,就无法再次找到切片

在这种情况下,这使得
HashSet
只是一个相当低效的
集合

但是,可以使用
迭代器

Iterator<Slice> iterator = pizza.iterator();
if (iterator.hasNext()) {
    iterator.next();
    iterator.remove();
}
Iterator Iterator=pizza.Iterator();
if(iterator.hasNext()){
iterator.next();
iterator.remove();
}

它将只删除由
迭代器返回的第一个切片,该切片可以是任意切片。

首先,您必须重写
slice
类中的
equals(Object o)
方法,这将有助于从
哈希集中删除
切片
对象

HashSet
中删除元素时,需要将传递的对象与已经存在的对象进行比较。您必须编写一个
equals(objecto)
方法,在什么条件下考虑两个
Slice
对象相等

然后使用此
pizza.remove(customSlice)

接口有一个remove方法来完成此工作。确保Slice正确地实现了hashcode和equals,因为这会影响set方法的行为

  • 您必须重写Slice类和扩展Penny类的所有类中的equals方法。 制作比萨饼需要它。移除方法有效。 例如,如果它们的类型、大小和价格彼此相等,那么一片就等于另一片。(或任何其他属性)
  • 然后你可以用

    Slice sliceToRemove = new Slice(type,size,price);
    pizza.remove(sliceToRemove);
    
  • 如果有类型、大小和价格相同的切片,它将从集合中删除切片

    无论如何,您必须具有标识集合中切片的属性


    在不覆盖equals的情况下,您必须遍历集合,检查这些属性,然后删除它们(如果它们匹配)。

    Javadoc来拯救!它取决于您如何识别
    切片
    对象以及
    hashcode()
    equals()
    的实现。顺便说一下,您的代码没有编译:什么是
    Penny
    ?这一点没有保证,这取决于
    切片
    类的构造方式。除非你在
    add()
    后面加上它,但那是不对的。这不会删除一个
    切片
    ,而是从哈希集中删除特定的
    切片
    对象。我假设,如果只有一个匹配项可以存在,那么最好在删除后中断迭代器循环。否则,最好(或需要)将它们放在另一个集合中,并在迭代完成后使用removeAll()。正如我记得的那样,并发修改将被抛出,否则。@Vadim它不应该进入在集合上迭代的任何循环中。IMHO关于添加后删除切片的问题已经完成,我也没有使用循环,即使我使用了循环:使用相同的迭代器应该可以防止
    ConcurrentModificationException
    。您只删除下一个元素,不管它是否是相同的切片。我不认为这是真正的目标。但不管怎样。。。要以一种或另一种方式删除特定的切片,必须定义切片平等性,以满足某些条件“要删除”的问题是用户显然没有要删除的特定切片。
    pizza.remove(slice)
    
    Iterator<Slice> iterator = pizza.iterator();
    if (iterator.hasNext()) {
        iterator.next();
        iterator.remove();
    }
    
    Slice sliceToRemove = new Slice(type,size,price);
    pizza.remove(sliceToRemove);