Java 分类图<;ArrayList,List<;实体>&燃气轮机;按键-ArrayList是一组日期

Java 分类图<;ArrayList,List<;实体>&燃气轮机;按键-ArrayList是一组日期,java,collections,comparator,sortedmap,Java,Collections,Comparator,Sortedmap,下面是比较器的代码,但是在SortedMap.putAll()之后,与源映射相比,SortedMap具有更少的映射条目 有人能帮忙吗 Comparator<ArrayList> arrayListComparer = new Comparator<ArrayList>() { @Override public int compare(ArrayList arrA, ArrayList arrB) {

下面是比较器的代码,但是在SortedMap.putAll()之后,与源映射相比,SortedMap具有更少的映射条目

有人能帮忙吗

Comparator<ArrayList> arrayListComparer = new Comparator<ArrayList>() {
                @Override
                public int compare(ArrayList arrA, ArrayList arrB) {
                    DateFormat formatter = new SimpleDateFormat("MMM-yyyy");
                    Date dateA = new Date();
                    Date dateB = new Date();
                    try {
                        dateA = formatter.parse(arrA.get(0).toString());
                        dateB = formatter.parse(arrB.get(0).toString());
                    } catch (ParseException ex) {
                        Logger.getLogger(ValueComparator.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    if (dateA.before(dateB)) {
                        return 0;
                    } else if (dateA.after(dateB)) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
            };
SortedMap sorted_map = new TreeMap(arrayListComparer);
sorted_map.putAll(map);
比较器arrayListComparer=新比较器(){ @凌驾 公共整数比较(ArrayList arrA,ArrayList arrB){ DateFormat格式化程序=新的SimpleDataFormat(“MMM yyyy”); Date dateA=新日期(); 日期b=新日期(); 试一试{ dateA=formatter.parse(arrA.get(0.toString()); dateB=formatter.parse(arrB.get(0.toString()); }捕获(解析异常){ Logger.getLogger(ValueComparator.class.getName()).log(Level.SEVERE,null,ex); } 如果(日期a.之前(日期b)){ 返回0; }如果(日期a.之后(日期b)){ 返回1; }否则{ 返回-1; } } }; SortedMap sorted_map=新树映射(arrayListComparer); 已排序的地图。putAll(地图);
如果你能给我们看一个地图的例子,那会很有帮助,但无论如何,我还是要冒险回答

造成这种情况的原因可能是,您的映射中有个条目,您的
compare
方法(在您的比较器中)返回0,这意味着键是相等的。如果它们相等,那么是同一个键。。。而且地图中不能有重复的关键点

你能看到问题吗

我将举一个小例子:

public static void main(String[] args) {
    Map<Bla, String> map = new HashMap<Bla, String>();
    map.put(new Bla(1,1), "bla1");
    map.put(new Bla(1,2), "bla2");
    map.put(new Bla(1,3), "bla3");

    System.out.println(map.size());

    TreeMap<Bla, String> treeMap = new TreeMap<Bla,String>(new Comparator<Bla>() {
        @Override
        public int compare(Bla bla, Bla bla1) {
            return new Integer(bla.a).compareTo(bla1.a);
        }
    });

    treeMap.putAll(map);

    System.out.println(treeMap.size());

}

private static class Bla{

    private Bla(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public int a;
    public int b;
}
publicstaticvoidmain(字符串[]args){
Map Map=newhashmap();
地图放置(新Bla(1,1),“bla1”);
地图放置(新Bla(1,2),“bla2”);
地图放置(新Bla(1,3),“bla3”);
System.out.println(map.size());
TreeMap TreeMap=新的TreeMap(新的比较器(){
@凌驾
公共整数比较(Bla-Bla,Bla-bla1){
返回新的整数(bla.a).compareTo(bla1.a);
}
});
树地图(地图);
System.out.println(treeMap.size());
}
私有静态类Bla{
私人Bla(内部a、内部b){
这个a=a;
这个.b=b;
}
公共INTA;
公共int b;
}
这将输出

三, 一,


因为我的比较器显示所有三个键都相同(仅比较“a”值)。

当您使用
SortedMap
SortedSet
时,只有当两个对象相等时,您的
比较器才会返回0。因为它根据这个标准处理键相等

参见自然排序:

例如,如果添加两个键a和b,则(!a.equals(b)&& a、 将(b)==0)与不使用显式 比较器,第二个加法操作返回false(和 排序集不会增加),因为a和b从 排序集的透视图


运行此程序时没有异常?无论比较器的逻辑如何,都不应该发生这种情况。你可能看错了。你能给出你正在测试的数据集吗?谢谢@Eugene。作品完美。嗨,这只是平等的问题。:)非常感谢你的帮助。我的错,整晚都在试图编码;)