A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

直入主题,估计有很多同学出现过这样的问题就像下面的代码:
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 TreeMap<Integer, String> tm = new TreeMap<Integer, String>(new Comparator<Integer>() {

  4.                         @Override
  5.                         public int compare(Integer o1, Integer o2) {
  6.                                 return o1 - o2 == 0 ? 1 : o1 - o2;
  7.                        
  8.                         }
  9.                 });
  10.                 tm.put(3, "a");
  11.                 tm.put(1, "a");
  12.                 tm.put(2, "a");
  13.                 for (int i : tm.keySet()) {
  14.                         System.out.println(i + "..." + tm.get(i));
  15.                 }
  16.         }
  17. }
复制代码

这段程序打印结果为:
  1. 1...null
  2. 2...null
  3. 3...null
复制代码
这是为什么?
原因就在 tm.get() 这个方法和比较器上,这个方法底层根据传入的键调用compare或者comparaTo方法去找集合中相同的键,当compare或者comparaTo方法返回0时,找到集合中的键,然后把对应的Value值返回给我们。
测试代码如下:
  1. import java.util.Comparator;
  2. import java.util.TreeMap;

  3. public class Test {
  4.         public static void main(String[] args) {
  5.                 TreeMap<Integer, String> tm = new TreeMap<Integer, String>(new Comparator<Integer>() {

  6.                         @Override
  7.                         public int compare(Integer o1, Integer o2) {
  8.                                 return o1 - o2 == 0 ? 1 : o1 - o2;     //没有返回0的情况
  9.                        
  10.                         }
  11.                 });
  12.                 tm.put(3, "a");
  13.                 tm.put(1, "a");
  14.                 tm.put(2, "a");
  15.                 System.out.println(tm);  //打印{1=a, 2=a, 3=a},说明value有值,确实存进去了
  16.                
  17.                 System.out.println(tm.get(3));   //打印null,get方法取不到value
  18.                
  19.         }
  20. }
复制代码

那么现在的问题就很明了了,如果自定义的比较器或者实现接口后的比较方法不能返回0,也就是说不去除重复的键的时候我们不能用keySe遍历得到键,再通过键去找值。只能用map.entry去遍历或者去掉重复的键也就是比较器方法要有返回0的情况。
  1. import java.util.Comparator;
  2. import java.util.Map;
  3. import java.util.TreeMap;

  4. public class Test {
  5.         public static void main(String[] args) {
  6.                 TreeMap<Integer, String> tm = new TreeMap<Integer, String>(new Comparator<Integer>() {

  7.                         @Override
  8.                         public int compare(Integer o1, Integer o2) {
  9.                                 return o1 - o2 == 0 ? 1 : o1 - o2;     //没有返回0的情况
  10.                        
  11.                         }
  12.                 });
  13.                 tm.put(3, "a");
  14.                 tm.put(1, "a");
  15.                 tm.put(2, "a");
  16.                 for (Map.Entry<Integer,String> me : tm.entrySet()) {
  17.                         System.out.println(me.getKey() + "..." + me.getValue());
  18.                 }
  19.                
  20.         }
  21. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马