【问题标题】:Retrieving object from HashSet in java从java中的HashSet中检索对象
【发布时间】:2016-04-15 16:08:04
【问题描述】:

我在编写代码时遇到了问题。我在 java 中使用 HashSet。
我的要求是,如果哈希集中不存在对象,则使用 add() 方法添加该特定对象。

但如果该对象已经存在,我需要将该特定对象保存在其他地方。但我没有看到 java 中 hashset 的 get() 方法。有人可以帮忙吗?

有什么方法可以从 HashSet 中获取对象,或者请提出一些其他的数据结构。

【问题讨论】:

标签: java hashset


【解决方案1】:

检索包含在 HashSet 中的对象的示例可能是

    HashSet<String> hSet = new HashSet<String>();
    hSet.add("XXX");

    Iterator iter = hSet.iterator();
    while(iter.hasNext()){

    String obj = (String)iter.next();
    System.out.println(obj);
    }

它输出 XXX

【讨论】:

  • 嗨,使用迭代器,我们可以得到一个一个存储的对象。我的要求是我的数据中有一个对象的克隆,并且我需要在尽可能短的时间内仅提取该对象。
  • 我不明白。如果您已经拥有一个对象的克隆(副本),为什么不直接使用该对象。抱歉,您确实需要更好地解释您的要求。
  • 我的要求是最小化空间。我的对象有限,但对它们的引用数百万。我会将所有这些对象存储在 HashSet 中。所以,我不能为每个引用创建新对象。我将一遍又一遍地引用同一个对象。我希望它现在清楚了。
  • 你能提供一些代码吗,因为我仍然不聪明。如果引用不是 null ,那么您已经有了对象。
  • // 让我试试。 HashSet stringSet = new HashSet(); stringSet.add("A"); stringSet.add("B"); // 等等很多字符串 // 现在我有一个字符串列表,它指向这个集合中的字符串。 List> myData = new ArrayList>; // 现在假设,我必须引用每个条目的两个字符串 for(int i=0; i tempList = new ArrayList(); tempList.add(new String("A")); tempList.add(new String("B")); myData.add(tempList); }
【解决方案2】:

要检查对象是否已经存在于集合中可以使用接口Collection的方法contains

或者简单地add它并检查add的返回值。 (详见add文档)

if (set.add(myObject)) {
    // Added
} else {
    // Not added because it was already present
}

【讨论】:

  • 不知道为什么这个正确答案被否决了——尤其是来自add的返回值的提示应该对OP有用,因为它允许简单地将他的对象保存在@中的“其他地方” 987654329@分行
【解决方案3】:

您可以使用HashMap&lt;YourClass,YourClass&gt;

YourClass yourClassKey = ...;
YourClass obj = map.get(yourClassKey); // if a key equal to yourClassKey is in the map,
                                       // you get the existing object from the map 
if (obj == null) { // if yourClassKey is not in the map, you add it
    map.put(yourClassKey,yourClassKey);
    obj = yourClassKey;
}

顺便说一句,使用HashMap 而不是HashSet 不需要更多内存,因为HashSet 在内部使用HashMap

【讨论】:

  • 为什么要使用地图?他没有解释可以通过键检索对象。与其使用具有相同类(和相同值)的键和值的 HashMap,不如使用 HashSet。它在内部作为 Map 工作,但不存储对一对(键、值)的引用。
  • @DavideLorenzoMARINO OP 想要的是数据结构中的原始对象。 Set 接口仅告诉您是否存在与您要查找的对象相等的对象在 Set 中,它不会返回实际对象,这是 OP 要求的。
  • 我想他要求 get 方法不知道存在 contains 方法。应该理解“那个特定的对象”是否是保存在集合中的对象或者可以是用于检查存在的参数
  • @DavideLorenzoMARINO 我假设 OP 知道 Set 有一个 contains 方法,因为 OP 看着界面足够长的时间注意到没有 get 方法。如果 OP 不需要检索 HashSet 中已经存在的实例,则使用 contains 将是简单的解决方案。
  • @Eran, David:谢谢你们俩。实际上我知道 contains 方法,但 Eran 正确理解它。我需要从集合中获取原始对象,并参考 this 获取其他一些参考。这样,我通过只创建一个对象并从多个位置引用它来节省内存。根据我的项目要求,内存很宝贵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
相关资源
最近更新 更多