我有两个班,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
}
}
}
答案 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中检索对象。