簡體   English   中英

Java Treemap put方法

[英]Java Treemap put method

我寫了這個方法。 我不明白為什么寫出這個例外:

線程“main”中的異常java.lang.ClassCastException:Kocsma.Sör無法強制轉換為java.lang.Comparable

誰知道我的錯誤是什么?

編譯器引用此行

beers.put(beer,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);
}

您的Beer類需要實現Comparable<Beer>或者您需要為TreeMap構造函數提供Comparator<Beer>

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 ,並覆蓋Beer上的equals()hashCode() (請參閱Effective Java Chapter 3以獲得對此的一個很好的參考)。

首先,如果要將它放在TreeMapBeer必須實現Comparable接口。 但是你為什么想要一個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);
}

在任何情況下,您可能希望覆蓋Beerequals() (和hashCode() )方法,以便它例如等於其名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM