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