Java Treemap put方法

时间:2011-11-29 18:48:26

标签: java map

我写了这个方法。我不明白为什么会写出这个例外:

  

线程“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
}

Class 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);
}

2 个答案:

答案 0 :(得分: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() { {1}}(有关此问题的详细参考,请参阅Effective Java Chapter 3。)

答案 1 :(得分: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)方法,以便它等于其名称。