2012-10-12 67 views
4

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

  • 保存它覆盖equals和哈希代码的类的对象
  • 将被循环搡对象到数据结构
  • 需要能够调用contains检查是否有一定对象存储在结构中
  • 如果contains返回true,则从结构中提取该特定对象并在该对象上调用某个getter

选项,我认为:

  • 地图 - 这适用于所有的需求,但我真的没有地图(键和值)。我所拥有的就是一堆物体。通过将对象存储为键和整数或值来强制使用地图是否是一种好的做法?

  • Set可以工作,但是它没有像get这样的获取方法。

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

我打开使用不同的库,如Apache公用或番石榴为例。

+1

有趣的是,你不想要一张地图,但你需要一个获取方法:-)你想获取什么?我想的对象。并根据什么标准?不,不是将对象存储为键(set?)和整数作为值并不是一个好主意。这是浪费内存并引入另一个调试向量。 – amn

回答

2

列表也可以工作,但它没有提取非基于索引的方法。

List有一个indexOf(Object)方法,它会做你想要的。

+0

他不需要'indexOf'方法,因为他的对象不能被索引检索,这是一个关键字的专门化。 OPs问题最后一段也提到了这一点。 – amn

+0

你读过OP的最后一点了吗?他说'List'不合适,因为他不能得到他用于'contains()'的对象的索引。这是'indexOf()'帮助的地方。 – Baz

+0

不,他所说的是“列表也可以工作,但它没有获取非索引的方法”。他想要一个不是**索引的方法。那是因为他不知道索引。他会做的是创建一个对象,并且由于类实现了'equals',他将简单地调用'contains'。当然,这一切都取决于'equals'的实现。 – amn

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

为什么downvote?在你投降后留下评论会更有成效。这样该帖子可以即兴创作。 –

+0

当然@Rohit。根据OP的标准,你的答案根本不是一个好的答案。我很抱歉遇到这样的事情。请检查他的明确要求 - 他需要的是一套。你只需在列表中模拟一个集合,为什么?一个集合提供了一个'contains'方法来利用'equals'和'hashCode'来“循环和推送”对象,如果你想检查它是否包含一个对象,那么你(再次)调用'contains(object)'。 – amn

+0

@amn ..你还必须注意到,他不想**迭代**来获取数据。 Set没有一个方法来获取索引。所以,即使他知道Set包含对象,他也必须迭代。这就是为什么我发布了两个选项。 –

-2

你需要一套。你不需要一个获取方法(你认为你这样做),因为就像你说的你只有一堆对象。并且由于这些使用了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")); 
+1

@amn ..好吧,现在你知道你的Set包含你的对象..现在你将如何获取它?使用'loop' ofcourse。这是OP不想要的。请重新阅读OP –

+0

不,您不太清楚'equals'是什么 - 如果对象相同,则不需要“原始”对象。将数据封装在对象中确保您可以使用您创建的任何新对象,该对象与该对象中的对象相同。**除非*当然,他**确实需要索引或键**,这使得我的答案无效。但这取决于他的物体的性质。我只是回答他的要求。 – amn

+0

@amn'contains()'只会告诉他它是被包含的,但除了循环之外没有别的方法来获取它。一个'list'也有'contains()',另外还有'indexOf()'。如果你认为他不必从'Collection'中取回对象,那么如果你使用'List'或'Set',它就没有任何区别。如果我建议一个'List',没有理由downvote。 – Baz

相关问题