为什么我不能使用Collections.max()函数来代码? - java

时间:2014-11-27 02:06:01

标签: java sorting generics collections comparator

我有10棵树。每棵树都有一些实例变量(空格,网格,适用性和id);地理空间和网格中的位置,表示从0到1的栖息地适用性的值,以及ID编号。

我已将这些树及其相关数据放入名为trees的ArrayList中。然后我让系统打印出他们的ID和相关的适用性值。代码如下。

最后,我想要打印出最高的适用性值,但我一直在最大限度地说错误:

  

“绑定不匹配:通用方法max(Collection<? extends T>)   类型Collections不适用于参数   (ArrayList<Trees>)。推断类型Trees不是有效的替代品   对于有界参数<T extends Object & Comparable<? super T>>

我似乎无法弄清楚这意味着什么。如果您需要查看更多代码,请与我们联系。

有谁知道我如何获得最高的适用性值(最接近1的值)?

int treeCount = 10;
for (int i = 0; i < treeCount; i++) {
    double suitability = RandomHelper.nextDoubleFromTo(0, 1);
    int id = i;
    context.add(new Trees(space, grid, suitability, id));

    ArrayList<Trees> trees = new ArrayList<Trees>();

    Trees tree;

    tree = new Trees(space, grid, suitability, id);
    trees.add(tree);
    System.out.println("Tree " + id + " has a suitability of " + suitability);

    Object obj = Collections.max(trees);
    System.out.println(obj);
}

2 个答案:

答案 0 :(得分:4)

您可能忘记实施Comparable<T> ..如果不这样做,就无法确定哪棵树是“最大的”..

您可能希望这样做:

public class Tree implements Comparable<Tree> {
    @Override
    public int compareTo(Tree o) {
        // use the value which should be used for comparison instead of getSuitability().
        // remember: here you have private access to object o. if your value is not a
        // double, there is also a Integer.compare(..) function, but you could also just
        // return value - other.value..
        return Double.compare(getSuitability(), o.getSuitability());
    }
    // .. code ..
}

如果您无法修改Tree课程,则可以随时实施Comparator<Tree>

public class TreeComparator implements Comparator<Tree> {
    @Override
    public int compare(Tree o1, Tree o2) {
        return Double.compare(o1.getSuitability(), o2.getSuitability());
    }
}

并将其与Collections.max(Collection, Comparator)函数一起使用:

Tree maxTree = Collections.max(trees, new TreeComparator());

如果您经常调用此代码,请考虑将new TreeComparator()调用解析为常量。

答案 1 :(得分:1)

看起来Trees无法比较。

思考 - Collections.max(trees)如何确定最大树是什么?

您有两种选择:

  1. Trees实施Comparable

  2. 实施Comparator并致电Collections.max(trees, comparator)