Make TreeMap Comparator Valid

This custom Valuecomparator sorts the value of the TreeMap by its value. But it does not throw a nullpointexception when looking to see if TreeMap has a specific key. How to change the comparator for zero point processing?

import java.io.IOException; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class TestTreeMap { public static class ValueComparator<T> implements Comparator<Object> { Map<T, Double> base; public ValueComparator(Map<T, Double> base) { this.base = base; } @Override public int compare(Object a, Object b) { /*if (((Double) base.get(a) == null) || ((Double) base.get(b) == null)){ return -1; } */ if ((Double) base.get(a) < (Double) base.get(b)) { return 1; } else if ((Double) base.get(a) == (Double) base.get(b)) { return 0; } else { return -1; } } } public static void main(String[] args) throws IOException { Map<String, Double> tm = new HashMap<String, Double>(); tm.put("John Doe", new Double(3434.34)); tm.put("Tom Smith", new Double(123.22)); tm.put("Jane Baker", new Double(1378.00)); tm.put("Todd Hall", new Double(99.22)); tm.put("Ralph Smith", new Double(-19.08)); ValueComparator<String> vc = new ValueComparator<String>(tm); TreeMap<String, Double> sortedTm = new TreeMap<String, Double>(vc); sortedTm.putAll(tm); System.out.println(sortedTm.keySet()); System.out.println(sortedTm.containsKey("John Doe")); // The comparator doesn't tolerate null!!! System.out.println(!sortedTm.containsKey("Doe")); } } 
+4
source share
1 answer

This is not rocket science ...

Paste this in place of the comment code:

 if (a == null) { return b == null ? 0 : -1; } else if (b == null) { return 1; } else 

This treats null as a smaller value than any non-zero Double instance.


Your version is incorrect:

 if ((a==null) || (b==null)) {return -1;} 

This says: "if a is null or b is null, then a is less than b."

This leads to fictitious relationships like

 null < 1.0 AND 1.0 < null null < null 

This thing causes tree invariants to collapse when zeros are displayed in the / set, and leads to inconsistent and unstable ordering of the keys ... and worse.

Requirements for a valid compare method are given in javadocs . The mathematical version is that the method should determine the general order in the domain of all possible input values.

+6
source

Source: https://habr.com/ru/post/1400165/


All Articles