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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈莹 中级黑马   /  2012-9-2 17:19  /  2841 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈莹 于 2012-9-2 19:48 编辑

import java.util.*;
class Mycom implements Comparator<Character>
{
  public int compare (Character s1,Character s2)
  {
          int a=s1.compareTo(s2);
           //return a;
          if (a==0)
             return 0;
          else
             return 1;
      }
}
public class TreeMapTest
{
public static void main(String args[])
{
  String s = "abca";
  String str = letterCount(s);
  System.out.println(str);
}
public static String letterCount(String s)
{
  int cou = 0;
  char[] ch = s.toCharArray();
  TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(new Mycom());
        for(int i=0;i<ch.length;i++)
  {
   Integer value = tm.get(ch);
   
   if(value != null)
    cou = value;
   cou++;
   tm.put(ch,cou);
   cou = 0;
    }
  
  //返回此映射中包含的键的 Set 视图。
  Set<Character> keyset = tm.keySet();
     Iterator<Character> it1  = keyset.iterator();
  while(it1.hasNext())
  {
   Character c = it1.next();
   Integer count = tm.get(c);//get()返回指定键所映射的值;
                             //如果此映射不包含该键的映射关系,则返回 null。
   System.out.print(c+"("+count+")");
  }
  System.out.println();
  System.out.println("===========================================");

  //返回此映射中包含的映射关系的 Set 视图。
  Set<Map.Entry<Character,Integer>> entryset = tm.entrySet();//返回此映射中包含的映射关系的 Set 视图
  
  Iterator<Map.Entry<Character,Integer>> it = entryset.iterator();
  StringBuilder sb = new StringBuilder();
  
  while(it.hasNext())
  {
   Map.Entry<Character,Integer> me = it.next();
   
   char c = me.getKey();
   int x = me.getValue();
   sb.append(c+"("+x+")");
  }
  return sb.toString();
}
}
程序运行的结果为{a=1;b=1,c=1,a=2},不是说put方法向TreeMap中添加映射关系时,如果该映射以前包含此键的映射关系,那么将替换旧值,但是这里为什么出现两个相同的键a呢?
假如用绿色代码替代红色代码,那么运行结果就是对的,{a=2;b=1,c=1},这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 希望继续加油

查看全部评分

12 个回复

倒序浏览
楼主红色代码的部分是不少了a<0的情况,加上去试试看
回复 使用道具 举报
compareTo是comparable接口的一个方法,比较的是对象与对象之间的顺序,
如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
楼主如果用return a语句的话,就包含了这三种情况,而用if  else语句的话
只不过把这三种情况分开处理,但是楼主红色代码少了一种当a为负数时的情况。
所以结果不一样!
回复 使用道具 举报
吴通 发表于 2012-9-2 18:05
compareTo是comparable接口的一个方法,比较的是对象与对象之间的顺序,
如果该对象小于、等于或大于指定对 ...

我这不是CompareTo方法,是Comparator的compare方法,另外,我是特意写的只有两种情况,一种是等于,一种是不等于。
回复 使用道具 举报
周兴华 发表于 2012-9-2 17:50
楼主红色代码的部分是不少了a

我只要两种情况,一种是等于,一种是不等于
回复 使用道具 举报
楼主再看看API手册吧,compare方法返回的是根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
回复 使用道具 举报


而楼主你的代码的情况如下:


主要是你的代码没写完整,出现了bug,还有就是TreeMap的底层数据结构是二叉树,比较的时候是会用到二叉树的。
辛苦半天,版主看见 加分哦{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 很详细的解答!

查看全部评分

回复 使用道具 举报
周兴华 发表于 2012-9-2 18:58
楼主再看看API手册吧,compare方法返回的是根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或 ...

我现在等于在重写compare方法呢,不可以按自己的要求返回值吗?必须返回0,整数和负数吗?
回复 使用道具 举报
陈莹 发表于 2012-9-2 19:08
我现在等于在重写compare方法呢,不可以按自己的要求返回值吗?必须返回0,整数和负数吗? ...

二叉树结构的数据之间,比较的结果必然是存在三种情况的。如果用楼主的方法来重写compare方法的话,会出现这样的情况,首先添加了一个元素a,第二次添加一个元素c时,c和a比较,按楼主的compare方法此时返回1即c比a大,第三次添加一个元素a时,此时a可能不是先跟那个已经添加了的a进行比较,而是和c进行比较,那么比较的结果返回的也是1,也就是说a比c大,那么这样的话结果就会出现错误了。
回复 使用道具 举报
周兴华 发表于 2012-9-2 19:25
二叉树结构的数据之间,比较的结果必然是存在三种情况的。如果用楼主的方法来重写compare方法的话,会出 ...

为什么不和之前的那个a比较呢?元素是如何比较呢?
回复 使用道具 举报
王自强 发表于 2012-9-2 19:05
而楼主你的代码的情况如下:

哦哦,我懂了!感谢你very much!
回复 使用道具 举报
问题已经解决!
回复 使用道具 举报
陈莹 发表于 2012-9-2 19:35
为什么不和之前的那个a比较呢?元素是如何比较呢?

我这里说的是假设,元素多了的话肯定就会出现类似这样的情况的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马