4

需求:

  • 存储覆盖等于和哈希码的类的对象
  • 将循环并将对象推入数据结构
  • 需要能够调用contains来检查某个对象是否存储在结构中
  • 如果contains返回 true,则从结构中获取该特定对象并getter在该对象上调用某个特定对象

我考虑过的选项:

  • 地图 - 这适用于所有需求,但我并没有真正的地图(键和值)。我所拥有的只是一堆物体。通过将对象存储为键和整数或值中的某些内容来强制使用映射是否是一种好习惯?

  • Set 可以工作,但是,它没有 get 之类的 fetch 方法。

  • List 也可以,但它没有非基于索引的获取方法。意思是,一旦contains返回 true,我将不得不遍历列表以找到我的特定对象的索引,然后获取它。

我愿意使用不同的库,例如 apache commons 或 guava。

4

3 回答 3

2

List 也可以,但它没有非基于索引的获取方法。

List有一种indexOf(Object)方法可以完全满足您的要求。

于 2012-10-12T11:11:29.030 回答
2

虽然这里best thing使用的scenarioMap,因为它提供了基于Key-Value对的快速检索。

List也允许基于索引获取数据。

因此,您可以使用 aList或 a Map。但为了使您的任务更轻松,我更喜欢Map. 因为我的情况是Map你不必搜索index一个对象,然后Object在那个索引处获取。获取只是一个one-line操作。

// When using a List.
List<String> myList = new ArrayList<String>();
if (myList.contains("rohit")) {
    myList.get(myList.indexOf("rohit"));
}

// When using Map.
Map<String, String> myMap = new HashMap<String, String>();
// You can directly fetch your object, based on some Key if you have one..
myMap.get("key"); 
于 2012-10-12T11:13:41.330 回答
-2

你需要一套。您不需要 fetch 方法(您认为您需要),因为就像您说的那样,您只有一堆对象。并且由于这些使用equalsand hashCode,一组正是您所需要的。

当然 map 也可以,因为它的键也是一个集合,但最后你需要更好地指定你的要求,因为看起来你对数据结构的目的有点困惑。据我了解,您确实不需要地图。

哈希集实现就可以了。以下是您可以使用的所有功能:

class Foo
{
    final String name;

    Foo(String name)
    {
        this.name = name;
    }

    boolean equals(Object obj)
    {
        return (obj instanceof Foo) && ((Foo)obj).name.equals(name);
    }
}

Set<Foo> fooSet = new HashSet<Foo>();

fooSet.add(new Foo("someFoo"));

assert fooSet.contains(new Foo("someFoo"));
于 2012-10-12T11:14:02.587 回答