2011-03-03 84 views
0

我有兩個班級,Foo和Bar。每個Foo都有一個名字和一堆物品。酒吧包含一串Foo,每個都有一個獨特的名字。集合的成員?

Bar有一個方法,使用fooName和item的AddEntry(1)如果foo的foo已經在Bar中,向Foo中添加另一個項目或(2)如果foo中的fooName不在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 
     } 

    } 
} 
+1

您應該使用'foo.name.equals(fooName)'比較'字符串'相等性' – Jeremy 2011-03-03 19:02:38

+0

您的示例是完整的還是僅僅是一種表示?如果完成,您可以使用地圖<字符串,列表>來存儲所有內容,然後使用地圖上的包含方法添加項目。 – Mikezx6r 2011-03-03 19:04:54

+0

這是一個表示,但關鍵是Bar包含一個Foos列表,每個Foos都有一個名稱和一個項目列表。 – foosion 2011-03-03 19:07:49

回答

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

這很好。 – foosion 2011-03-03 19:54:37

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)

+0

這也很好。 – foosion 2011-03-03 19:57:40

2

在酒吧類,你應該FooName使用HashMap中,而不是ArrayList的關鍵和Foo成對。由於HashMap具有o(1)搜索時間,您正在使用arraylist中的for循環創建。

+0

試圖不要放棄代碼片段思維@foosion正在學習:) – Ankur 2011-03-03 19:19:14

1

你可以嘗試在Bar中使用HashMap,而不是使用List。使用fooName作爲唯一鍵。這樣一來,在酒吧,你可以檢查是否foo的實例在當前的酒吧已經知道要快得多(只是沿着這個東西線):

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

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

如果富的名字就是那裏的查找,或許一個Map<String,List<Foo>>(並刪除Foo.name)會使你免於編碼。

1

除非foo必須保持相同的順序,否則您可以用Map<String, Foo>替換您的foos列表。搜索現有的foo將成爲O(1)操作而不是O(n)操作。

即使foos必須保持有序,您也可以使用LinkedHashMap。

0

這是正確的,但如果您正在尋找正確的foo對象而不是使用List,請使用Map,如HashMap。用作關鍵字fooName並將值作爲Foo對象。使用get(fooName)獲取要查找的對象,如果返回null,則不存在,並添加新的Fooput()

0

最好的方法和更可維護的方法是使用hashCode並使用contains。

public int hashCode(){ return fooName。的hashCode(); }

這必須比for:loop更快。雖然它不能爲你提供O(1)的複雜性,但它保證了(理論上)固定檢索。另外get()方法在hashMap上也是這樣。它使用hashCode從Map中檢索對象。