2011-11-29 92 views
2

我寫了這個方法。我不明白爲什麼它寫出此異常:在線程「主要」 java.lang.ClassCastExceptionJava Treemap放置方法

例外:Kocsma.Sör不能轉換爲java.lang.Comparable的

任何人知道我的錯誤是什麼?

編譯器參考這一行

beers.put(啤酒,DL);

這是我的代碼:

private Map<Beer, Integer> beers = new TreeMap<Beer, Integer>(); 


public void Upload(Beer beer, int dl) { 
    int d = 0; 
    Beer s = null; 
    for (Map.Entry<Beer, Integer> item : beers.entrySet()) { 
     if (item.getKey().equals(beer)) { 
      d = item.getValue(); 
      s = item.getKey(); 
     } 
    } 
    if (s != null) { 
     beers.put(s, d + dl); 
    }else 
    beers.put(beer, dl); // Here is the problem by the Compiler 
} 

類Kocsma:

public Kocsma() { 
    Upload(new Beer("Borsodi sör", 160, 4.6), 1000); 
    Upload(new Beer("Pilsner Urquell", 250, 4.4), 800); 
    Upload(new Beer("Soproni Ászok", 150, 4.5), 900); 
    Upload(new Beer("Dreher Classic", 200, 5.2), 600); 
} 

回答

7

Beer類需要實現Comparable<Beer>或者你需要提供Comparator<Beer>TreeMap構造。

private static class BeerComparator implements Comparator<Beer> { 
    @Override 
    public int compare(Beer b1, Beer b2) { 
     //return a value > 1 if b1 is greater than b2, < 1 if b2 greater than b1, 
     //and exactly 0 if the two are equal 
    } 
} 

beers = new TreeMap<Beer, Integer>(new BeerComparator()); 

TreeMap通過使用二叉搜索樹來存儲密鑰。這對於一些常見的類如IntegerString毫無用處,因爲它們可自然排序並實現Comparable開箱即用。但是,對於您的Beer類,您必須手動實施。

如果Beer是不是比較一個很好的候選人(大部分的東西都沒有),那麼可以考慮使用HashMap代替,和壓倒一切的equals()hashCode()Beer(見Effective Java Chapter 3對這個有很大的參考)。

+0

是的 - 是的,但我仍然不明白,爲什麼它必須Comparable。因爲它只是一個加法... – blaces

+0

呵呵,導致TreeMap存儲像bst這樣的密鑰? – blaces

+0

@blaces,這是正確的。它使用紅黑樹實現 –

1

首先,Beer必須實現Comparable接口,如果要將其放入TreeMap。但爲什麼你想要一個TreeMap?你可以使用一個HashMap

而且你的代碼看起來簡單得多:

private Map<Beer, Integer> beers = new HashMap<Beer, Integer>(); 

public void Upload(Beer beer, int dl) { 
    Integer d = beers.get(beer); 
    if (d != null) { 
    beers.put(beer, d + dl); 
    }else 
    beers.put(beer, dl); 
} 

在任何情況下,你可能要覆蓋equals()(和hashCode())方法Beer,使之等於其名稱爲例子。