一个集合的成员?

时间:2011-03-03 18:58:08

标签: java collections

我有两个班,Foo和Bar。每个Foo都有一个名字和一堆物品。 Bar包含一堆Foo,每个都有一个唯一的名称。

Bar有一个方法,AddEntry接受fooName和item(1)如果fooName的foo已经在Bar中,则向Foo添加另一个项目或者(2)如果fooName的foo不在Bar中,创建一个具有该名称的Foo,并将该项添加到新的Foo。

这是我如何实施的概述。有没有更好的办法?我只是在学习Java,但这看起来很笨重

class Foo { // a name and some items
    String fooName;
    List<Object> items = new ArrayList<Object>;
    Foo(name) {...} // create a named Foo
    AddtoFoo(item) {...} // add an item to this Foo
}

class Bar { // a bunch of foo's
    List<Foo> fooList = new Arraylist<Foo>;

    void AddEntry(String fooName, Object item) {
        boolean member = false;
        for(Foo foo : fooList){
            if{foo.name == fooName) {
                member = true;
                foo.AddtoFoo(item); // adds an item to this foo
                break;
             }
        }
        if(member == false) {
            Foo foo = new Foo(fooName); // creates a named foo
            foo.AddtoFoo(item);  // adds the item
            fooList.add(foo);  // maintain our list of foo's
        }

    }
}

8 个答案:

答案 0 :(得分:2)

我使用Map<String, Foo>将foo名称映射到foo对象。

Map<String, Foo> fooMap = new HashMap<String, Foo>();

因此你可以做到

Foo foo = fooMap.get(fooName);
if( foo == null)
{
  foo = new Foo(fooName);
  fooMap.put(fooName, foo);
}
foo.AddtoFoo(item); 

答案 1 :(得分:2)

您可能希望使用Map代替,您可以通过密钥查找对象。

Map<String,Foo> fooMap = new HashMap<String,Foo>();
foo.put("name_of_foo",new Foo());

然后您的addEntry可能如下所示:

void addEntry(String fooName, Object item){
    Foo foo = fooMap.get(fooName);
    if(foo == null){
       foo = new Foo();
       fooMap.put(fooName,foo);
    }
    foo.addToFoo(item);
}

此外,您应该使用String

来比较foo.name.equals(fooName)平等

答案 2 :(得分:2)

在bar类中,你应该使用HashMap而不是ArrayList,FooName作为键,Foo作为对。由于HashMap具有o(1)搜索时间,你正在使用arraylist中的for循环itoreation。

答案 3 :(得分:2)

如果foo的名字只是用于查找,那么Map<String,List<Foo>>(并删除Foo.name)可能会使您免于编码。

答案 4 :(得分:1)

您可以尝试在Bar中使用HashMap,而不是使用List。使用fooName作为唯一键。通过这种方式,在Bar中,您可以检查当前条形图中Foo的实例是否已经知道得更快(就像这样的内容):

Map<String, Foo> fooMap = new HashMap<String, Foo>();

... 
Foo foo = fooMap.get(fooName);
if(foo == null)
{
   fooMap.add(fooName, new Foo(fooName));
}

答案 5 :(得分:1)

除非foo必须保持相同的顺序,否则您可以用Map<String, Foo>替换您的foos列表。搜索现有的foo将成为O(1)操作而不是O(n)操作。

即使foos必须保持有序,你也可以使用LinkedHashMap。

答案 6 :(得分:0)

这是正确的,但如果您正在寻找合适的foo对象,而不是使用List,请使用Map,例如HashMap。用作fooName的关键字和Foo对象的值。使用get(fooName)获取您正在查找的对象,如果返回null,则不存在,并使用Foo添加新的put()

答案 7 :(得分:0)

最好的方法和更易于维护的方法是使用hashCode并使用contains。

public int hashCode(){  return fooName.hashCode(); }

这必须比:loop更快。虽然它没有为你提供O(1)复杂性,但它保证(理论上)固定检索~O(1)

此外,get()方法在hashMap上也是如此。它使用hashCode从Map中检索对象。