我应该根据自己的需要使用哪种数据结构?

时间:2012-10-12 11:09:53

标签: java data-structures architecture

需要:

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

我考虑的选项:

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

  • 设置可行,但是,它没有像get这样的提取方法。

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

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

3 个答案:

答案 0 :(得分:2)

  

列表也可以,但它没有一个非基于索引的获取方法。

List有一个indexOf(Object)方法可以完全按照您的要求进行操作。

答案 1 :(得分:2)

虽然此best thing中使用的scenario将是 Map ,但因为它提供了基于Key-Value对的快速检索。

List也允许根据索引获取数据。

因此,您可以使用ListMap。但为了让您的工作更轻松,我更喜欢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"); 

答案 2 :(得分:-2)

你需要一套。你不需要一个fetch方法(你认为你这样做),因为就像你说你只有一堆对象。由于这些使用了equalshashCode,因此正是您需要的一套。

当然地图也可以这样做,因为它的键也是一组,但最后你需要更好地指定你的要求,因为看起来你对数据结构的目的有点困惑。据我所知,你确实不需要地图。

哈希集实现可以。以下是您可以使用的所有内容:

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"));