Java树映射获取最小值和最大值

Java树映射获取最小值和最大值,java,Java,我有这种树形图。在城镇中输入一些条目后,如何获得城镇温度的最小值和最大值?我不会复制在towns中填充某些值的代码,因为它工作正常 Map<String, Town> towns = new TreeMap<>(); 如果您不在Java8中,您必须按值对映射进行排序才能实现这一点,可能类似于这样 public static Map<String, Town> sortByValues(final Map<String, Town> map) {

我有这种树形图。在
城镇
中输入一些条目后,如何获得城镇温度的最小值和最大值?我不会复制在
towns
中填充某些值的代码,因为它工作正常

Map<String, Town> towns = new TreeMap<>();

如果您不在Java8中,您必须按值对映射进行排序才能实现这一点,可能类似于这样

public static Map<String, Town> sortByValues(final Map<String, Town> map) {
    Comparator<String> valueComparator =  new Comparator<String>() {
        public int compare(String k1, String k2) {
            if (map.get(k1).getTemperature() < map.get(k2).getTemperature()) {
                return 1;
            } else if (map.get(k1).getTemperature() == map.get(k2).getTemperature()) {
                return 0;
            } else {
                return -1;
            }
        }
    };
    Map<String, Town> sortedByValues = new TreeMap<String, Town>(valueComparator);
    sortedByValues.putAll(map);
    return sortedByValues;
}
然后,在位置0处有最大值,在最后一个元素中有最小值

更新

更改代码以进行编译。

最简单的方法是:

Optional<Town> maybeMinTown = towns.values().stream()
.min(Comparator.comparing(Town::getTemperature));

Town minTown = maybeMinTown.get(); // throws NoSuchElementException when towns map is empty

optionant
int
相同
Optional
Town
相同,但这不起作用-您希望如何使用
Comparator
实例化
TreeMap
,它比较整个条目而不是键?贴图仅对关键点起作用,值仅存储在基于关键点计算的内存中的适当位置。或者我错过了什么?是的,我现在在月食中看到了。。。谢谢你指出这一点。当我打印你答案中的代码时,我得到了可选的[com.wcond.model]。Town@682a0b20] ? 如何解决此问题?您只需调用
Optional#get
。解释了
Optional
s背后的整个思想。简单地说,这只是一个占位符,可以有一些价值或没有。在您的情况下,
Optional.empty()
在映射为空时返回:-)当然要注意-如果您在
Optional.empty()
对象上调用
get()
,则会引发
NoTouchElementException
。我不理解它。请举个例子。我更新了上面的答案,你现在满意吗?你只想做一次,还是多次?(假设这是家庭作业;你需要一次、一次还是多次获得该值?@Dean J我只需要一次。
towns = sortByValues(towns);
Optional<Town> maybeMinTown = towns.values().stream()
.min(Comparator.comparing(Town::getTemperature));

Town minTown = maybeMinTown.get(); // throws NoSuchElementException when towns map is empty
final OptionalInt min = towns.values().stream()
.mapToInt(Town::getTemperature)
.min();

min.getAsInt(); // or you can call min.orElseGet(some_lowest_value)