Java 分类图<;ArrayList,List<;实体>&燃气轮机;按键-ArrayList是一组日期
下面是比较器的代码,但是在SortedMap.putAll()之后,与源映射相比,SortedMap具有更少的映射条目 有人能帮忙吗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) {
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。作品完美。嗨,这只是平等的问题。:)非常感谢你的帮助。我的错,整晚都在试图编码;)