Why cant I use the Collections.max() function for this code? - java
collections, comparator, generics, java, sorting
Solution
You might have forgotten to implement `Comparable<T>`.. Without doing so, there is no way of telling which tree is the "biggest"..
You might want to do it something like that:
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 ..
}
If you can't modify the `Tree` class, you can always implement a `Comparator<Tree>`
public class TreeComparator implements Comparator<Tree> {
@Override
public int compare(Tree o1, Tree o2) {
return Double.compare(o1.getSuitability(), o2.getSuitability());
}
}
And use it along with the `Collections.max(Collection, Comparator)` function:
Tree maxTree = Collections.max(trees, new TreeComparator());
If you are calling this code often, consider extracting the `new TreeComparator()` call to a constant.
Problem
I have 10 trees. Each tree has a few instance variables (space, grid, suitability, and id); a place in geographic space and on a grid, a value representing habitat suitability from 0 to 1, and an ID number respectively. I have put these trees and their associated data into a ArrayList called trees. And then I have the system print out their ID and associated value of suitability. The code is below. At the end, I want to print out the highest suitability value, but I keep getting an error under max saying: "Bound mismatch: The generic method `max(Collection<? extends T>)` of type `Collections` is not applicable for the arguments (`ArrayList<Trees>`). The inferred type Trees is not a valid substitute for the bounded parameter `<T extends Object & Comparable<? super T>>`" I cant seem to figure out what this means. Please let me know if you need to see more code. Does anyone know how I can get the highest suitability value (the value closest to 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); } ```