【问题标题】:How to remove and return an object from a Hashset?如何从 Hashset 中删除并返回一个对象?
【发布时间】:2014-12-02 02:36:15
【问题描述】:

我有一个填充了 Penny 对象的 Hashset,我想创建一个方法来从 HashSet 中删除其中一个 Penny 对象并将其返回。这是我为此创建的方法,但由于收到错误消息,它不起作用。有人可以向我解释这样做的正确方法

public Penny removePenny(){

    if(penniesSet.size()<= 0){
        return null;
    }
    else 
        penniesSet.remove(Penny)

    return penniesSet.get(Penny)
}

【问题讨论】:

  • 什么类型的错误信息?
  • 我假设您已经在实际代码中输入了缺少的;,但您忘记在上面输入
  • penniesSet.remove(Penny)
  • 由于多种原因无法编译。我建议你先从一本书入手,Stack Overflow 不能替代书本、教程或课程。

标签: java hashset bluej


【解决方案1】:

penniesSet.remove(Penny)penniesSet.get(Penny) 将不起作用,因为 Penny 是类名,而不是值。如果你想从集合中移除任何元素,请使用set.iterator().next()

public Penny removePenny() {

    if (penniesSet.size() == 0) {
        return null;
    }
    Penny penny = penniesSet.iterator().next();
    penniesSet.remove(penny);
    return penny;
}

【讨论】:

  • 这个答案是错误的,remove() 返回一个boolean。有关正确的实现,请参阅我的答案。
  • @ÓscarLópez 哎呀,在Map 上考虑remove
  • 您是否只是复制粘贴我自己的答案,甚至没有给予信用?!太棒了。
  • @ÓscarLópez 不要那么热衷于攻击别人...我错误地使用了remove,实际上在您更新之前使用了Iterator 概念。
  • 我可以确认 August 正在使用迭代器概念,而我的屏幕上 Oscar 的帖子仍然有 penniesSet.remove(Penny) 行(请参阅我在他的帖子上的 cmets)。我不确定所指出的“事实”是什么,因为我所看到的只是一个被掩盖为问题的指控,但指控所暗示的“事实”并不存在。
【解决方案2】:

您正在将类型 Penny 传递给 remove 方法。你应该传递一个对象。

至于get 方法,您可能应该阅读以下内容: Why doesn't java.util.HashSet have a get(Object o) method?

此外,如果Penny 没有正确的hashCode() 方法,可能会导致在Hashset 中查找对象时出现问题。

像这样删除任意Penny 可能并不是您一开始想要做的事情。如果您想删除最后添加的一个(称为从堆栈中弹出),您可能需要使用different collection

【讨论】:

    【解决方案3】:

    您必须使用 Iterator 从 Hashset 中返回和删除 penny 对象。 试试下面的代码:

    public Penny removePenny(){
        Penny p = null;
        Iterator it = penniesSet.iterator();
        if(it.hasNext()) {
            p = (Penny) it.next();
            it.remove();
        }
        return p;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多