黑马程序员技术交流社区

标题: TreeMap集合排序的问题,高手来啊 [打印本页]

作者: 孙浩迪    时间: 2012-6-15 15:44
标题: TreeMap集合排序的问题,高手来啊

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.TreeMap;

public class SortMapByValue {
public static void main(String[] args){
TreeMap<String,Integer> newMap=new TreeMap<String,Integer>();
newMap.put("aaa10", 1);
newMap.put("aaa9", 5);
newMap.put("aaa4", 4);
newMap.put("aaa7", 7);
newMap.put("aaa6", 6);
newMap.put("aaa3", 3);
newMap.put("aaa10", 10);


ByValueComparator bvc =new ByValueComparator(newMap);


List<String> newList=new ArrayList<String>(newMap.keySet());

Collections.sort(newList, bvc);

for(String str:newList){
       
System.out.println(str+".........................."+newMap.get(str));

}

}

/**
* @description
* 对Map按值进行排序
*  
* */
static class ByValueComparator implements Comparator<String> {

TreeMap<String, Integer> base_map;

public ByValueComparator(TreeMap<String, Integer> base_map) {

this.base_map = base_map;

}

public int compare(String arg0, String arg1) {

if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1)) { //这个判断让我很不解,很头疼,为什么把这改== 就不排序了呢,
                                                                                                             //这个代码的意思是不是base_map.containsKey(arg0),如果集合里
                                                                                                            //不包含这个键的话,就return 0 , return 0  就是添加不进去值。
                                                                                                          //我这样理解对不对呢?   如果是这样的话,这个让我想不出来起到什么作用了,而现在它有很大的用,不用这个代码就不排序了。

return 0;

}

if (base_map.get(arg0) > base_map.get(arg1)) {

return 1;

} else if (base_map.get(arg0) == base_map.get(arg1)) {

return 0;

} else {

return -1;

}

}

}

}


我注解那块判断不太懂,希望高手能解答。  解答的时候最好细点解答,要不听不懂的。。。  
作者: 揭耀祖    时间: 2012-6-15 17:24
if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1)) //如果这里改成"=="了,那么意义就完全变了,变成了当base_map中都含有argo和arg1或者都不含有arg0和arg1 时,返回0;  而一旦这里返回了值了下面的各种if语句就不执行了,那么但凡以后比较两个元素时它们只要都在容器里面就被当作是相等的了。
作者: 张洁    时间: 2012-6-15 18:33
分析你的问题:
1、为什么改成==就不可以了。
  这里要分析containsKey和==的区别
==当比较对象的时候,比较的是具体内存地址。而containsKey才是实现了这里需要的功能:是否包含指定键的影射关系

2、为什么返回0 1 -1。。。
这里的compare其实是JAVA中本来具有的一个方法,查询API有:

compare
public static int compare(double d1,
                          double d2)比较两个指定的 double 值。返回的整数值的符号与将通过以下调用所返回的整数的符号相同:
    new Double(d1).compareTo(new Double(d2))

参数:
d1 - 要比较的第一个 double
d2 - 要比较的第二个 double
返回:
如果 d1 在数字上等于 d2,则返回 0;如果 d1 在数字上小于 d2,则返回小于 0 的值;如果 d1 在数字上大于d2,则返回大于 0 的值。
从以下版本开始:
1.4


可以看出,JAVA也设定了返回值。(和我的conpare不同,参考下JAVA的设定)
这样其实是方便你的调用。
比如定义好方法后,其他地方可以这么判断:
if(a.compare(b) = 0) {
  相应操作
}
if(a.compare(b) = -1) {
  相应操作
}
if(a.compare(b) = 1) {
  相应操作
}
这样你可以对相应的比较结果进行接下来的操作。
就是这个作用啦~


或许你又会疑惑为什么要返回-1 0 1的int值呢~
仔细想一下也好理解,当有两种结果时,我们设定返回值为boolean,这样就能包括所有情况~

但是这里的对比有仨情况,大于 等于 小于。布尔型就不够用啦~ 所以我们简单的指定为int型,
并自己定义0 -1 1这样三个值对应三种比较情况~
作者: 孙浩迪    时间: 2012-6-15 20:27
jxj4227982333 发表于 2012-6-15 17:24
if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1)) //如果这里改成"=="了,那么意义就完全变 ...

if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1))
你就说说这句话起到了什么作用啊?

是不是如果map集合里不包含键arg0 ,   如果不包含的话return 0   .  

不包含就相等。。 我琢磨不明白,都不包含了怎么相等。。。
作者: 孙浩迪    时间: 2012-6-15 20:32
张洁 发表于 2012-6-15 18:33
分析你的问题:
1、为什么改成==就不可以了。
  这里要分析containsKey和==的区别

就把if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1))
       return 0  

这个代码给我解释下好了,    传进来个集合, 说这个集合不包含键, 就认为相等。

不包含键,还rreturn 0 干啥,没意义啊

作者: 揭耀祖    时间: 2012-6-15 21:54
sunhaodi 发表于 2012-6-15 20:27
if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1))
你就说说这句话起到了什么作用啊?

if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1))
不知这句代码你是哪里搞来的,但是写这句代码的作者的意图很明确,就是首先判断要比较的元素在不在容器里面,如果不在的话就当作和容器里的某个元素相同,那么自然就不会再加进去咯,但是compare()函数比较的都是即将加进去的元素或者已经加进去的元素,跟本不会拿它去和不在容器里的元素相比,所以我觉得这句代码有点多余,你可以试下把这句删掉看看可以不。
作者: 孙浩迪    时间: 2012-6-15 21:58
jxj4227982333 发表于 2012-6-15 21:54
if (!base_map.containsKey(arg0)||!base_map.containsKey(arg1))
不知这句代码你是哪里搞来的,但是写这 ...

是啊,这次你说到点子上了,我也感觉多余, 所以我删了, 删完了,就不排序了, 然后把这句还原就会排序,所以一直很迷忙





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2