Java中的TreeMap

时间:2014-04-28 09:47:22

标签: java

import java.util.Comparator;
import java.util.TreeMap;
public class Manager {

     public static void main(String[] args) {

          TreeMap tmap1 = new TreeMap(new C.D());
          tmap1.put(new C(9, 1), 9);
          tmap1.put(new C(0, 10), 19);
          tmap1.put(new C(1, 8), 92);
          tmap1.put(new C(8, 0), 91);
          tmap1.put(new C(5, 4), 39);
          tmap1.put(new C(5,4), 73);//this line

          System.out.println(tmap1);
        }
}

  class C {
      int i, j;

         C(int i, int j) {
             this.i = i;
             this.j = j;
           }

        public String toString() {
           return "(i=" + i + ",j=" + j + ")";
         }

       static class D implements Comparator {
             public int compare(Object obj1, Object obj2) {
               return ((C)obj1).i - ((C)obj2).i;
             }
      }

  }

//我们知道TreeMap根据键进行排序,在这里我传递一个比较器并根据变量i进行排序。当我尝试在treemap1中输入新条目时,我在评论中提到它为{{1} },它在删除前一个相同的条目时添加这个新条目。好类C不会覆盖hashcode()和equals()方法,因此新条目与之前的条目完全不同,因为它们具有基于Object类的不同hashcode(),因此两个条目都应保留在map中,但只添加新条目和之前的一个删除。

2 个答案:

答案 0 :(得分:1)

如果是行

tmap1.put(new C(5,4), 73);

你的比较器返回0,因此它对于JVM是重复的并且它会覆盖它。

如下所示放置一个调试语句并重新运行程序,您将了解事实..

     public int compare(Object obj1, Object obj2) {
       System.out.println("in compare difference is : "+ (((C)obj1).i - ((C)obj2).i));
       return ((C)obj1).i - ((C)obj2).i;
     }

你将得到低于输出......最后看到零(0)

in compare : -9
in compare : -8
in compare : 1
in compare : 7
in compare : -1
in compare : 4
in compare : -4
in compare : -3
in compare : 4
in compare : -3
in compare : 0

答案 1 :(得分:1)

在您的情况下,问题是因为如果您使用TreeMap并提供Comparator,则还应提供正确的equals方法。它位于TreeMap的JavaDoc中:

  

请注意,如果此有序映射要正确实现Map接口,则树映射维护的顺序(如任何已排序的映射,以及是否提供显式比较器)必须与equals一致

您的equals方法是从Object继承的,并且与您的Comparator不一致。

使用TreeMap put方法获取战利品,并将其与HashMap put方法进行比较。 TreeMap的版本仅使用compareTo方法,而不是像HashMap中的equals那样。

从Java 1.5开始,你不应该使用原始类型