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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zw2008 中级黑马   /  2016-4-9 00:11  /  1510 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.heima.homework;
import java.util.Comparator;
import java.util.TreeMap;
public class Test4 {
/**分析以下需求,并用代码实现:
(1)统计每个单词出现的次数
(2)有如下字符串"If you want to change your fate I think you must come to the dark horse to learn java"(用空格间隔)
(3)打印格式:
  to=3
    think=1
    you=2
  * @param args
  */
public static void main(String[] args) {
  String str ="If you want to change your fate I think you must come to the dark horse to learn java";
  //定义一个map集合
  TreeMap<String, Integer> map = new TreeMap<String, Integer>(new Comparator<String>() {
   @Override
   public int compare(String s1, String s2) {
    // TODO Auto-generated method stub
    return 1;
   }
  });
  //将字符串切割成字符数组
  String [] arr = str.split(" ");
  //将切割的字符数组添加到map集合中
  for (int i = 0; i < arr.length; i++) {
   String string = arr[i];
   if(null==map.get(string)){
    map.put(string, 1);
   }else{
    map.put(string, map.get(string)+1);
   }
  }
  //按照格式遍历打印
  for (String string : map.keySet()) {
   System.out.println(string+"="+map.get(string));
  }  
}
}





打印结果是
If=null
you=null
want=null
to=null
change=null
your=null
fate=null
I=null
think=null
you=null
must=null
come=null
to=null
the=null
dark=null
horse=null
to=null
learn=null
java=null
错误在哪啊实在找不到






19 个回复

正序浏览
kelin410 发表于 2016-4-17 21:20
我把我写的给你看下吧!

大神 膜拜一下
回复 使用道具 举报

我把我写的给你看下吧!
  1. package Test;

  2. import java.util.Map.Entry;
  3. import java.util.TreeMap;
  4. public class Demo {
  5.         /**分析以下需求,并用代码实现:
  6.         (1)统计每个单词出现的次数
  7.         (2)有如下字符串"If you want to change your fate I think you must come to the dark horse to learn java"(用空格间隔)
  8.         (3)打印格式:
  9.                   to=3
  10.             think=1
  11.             you=2
  12.         * @param args
  13.         */
  14. public static void main(String[] args) {
  15.         String str ="If you want to change your fate I think you must come to the dark horse to learn java I";
  16.         //定义一个map集合
  17.         TreeMap<String, Integer> map = new TreeMap<String, Integer>();

  18.         //将字符串切割成字符数组并将切割的字符数组添加到map集合中
  19.         for (String s : str.split(" "))
  20.                 map.put(s, map.containsKey(s)? map.get(s) + 1 : 1);
  21.   
  22.         //按照格式遍历打印
  23.         for (Entry<String, Integer> en : map.entrySet())
  24.                 System.out.println(en.getKey() + "=" + en.getValue());
  25.         }
  26. }
复制代码
回复 使用道具 举报

还有一点忘记了,你集合中的键是String。不需要使用比较器。因为String中已经具备比较功能了!
回复 使用道具 举报
public static void main(String[] args) {                 String str = "If you want to change your fate I think you must come to the dark horse to learn java";                 String[] strs = str.split(" ");                                  TreeMap<String, Integer> tm = new TreeMap<>();                 for(String s : strs){                         tm.put(s, tm.containsKey(s) ? tm.get(s) + 1 : 1);                 }                 System.out.println(tm);         }
回复 使用道具 举报
lidandan 发表于 2016-4-13 22:18
1,首先你先把TreeMap换成HashMap集合,因为没有强制要求,你就用HashMap呗
2,把String, Integer>(new Com ...

十分感谢
回复 使用道具 举报
1,首先你先把TreeMap换成HashMap集合,因为没有强制要求,你就用HashMap呗
2,把String, Integer>(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
     // TODO Auto-generated method stub
     return 1;
    }
   });        去掉,这个完全没用么,不知道你写这个干吗
3,把这个地方用增强for循环要好些吧,还有判断,不是null,而是不包含这个键要用containsKey()
  for (int i = 0; i < arr.length; i++) {           //改这样             for (String string : arr) {
    String string = arr[i];                              //                          if(!map.containsKey(string)){
    if(null==map.get(string)){
然后其他的地方都没什么问题了,我运行出来是这个样子
think=1
fate=1
learn=1
want=1
change=1
I=1
come=1
your=1
the=1
horse=1
java=1
dark=1
must=1
to=3
If=1
you=2
回复 使用道具 举报
kelin410 发表于 2016-4-13 01:16
你错在哪里了?这个要先弄清楚你所说的错是哪个错误。因为你的代码错误不止1处。
1)首先我猜测你是为为什 ...

我好好看看
回复 使用道具 举报
不错,看评论,也跟着学习一下
回复 使用道具 举报
你错在哪里了?这个要先弄清楚你所说的错是哪个错误。因为你的代码错误不止1处。
1)首先我猜测你是为为什么是输出的结果为null是吗?
        1.  输出null是因为比较器的关系!你只需要使用Entry遍历值就不为null了。因为Entry是Map接口中的内部接口,可以直接访问Map集合中的数据。
  1. //使用Entry遍历打印
  2.           for (Entry<String, Integer> en : map.entrySet()) {
  3.                   System.out.println(en.getKey() + "=" + en.getValue());
  4.           }
复制代码

              
         2.  或则你使用HashMap集合,不要使用TreeMap。

2)其次你的思路是有问题的,你这样做的结果是每个单词都会被存入到集合中。因为你比较器无论是否相同。返回的都是1。应当进行判断。
  1. //定义一个map集合
  2.                 TreeMap<String, Integer> map = new TreeMap<String, Integer>(new Comparator<String>() {
  3.                         public int compare(String s1, String s2) {
  4.                                 if (s1 == null && s2 == null)                //健壮性判断,防止null调用方法报错。
  5.                                         return 0;
  6.                                 if (s1 == null && s2 != null)                //保证null向后排序
  7.                                         return -1;
  8.                                 if (s1.equals(s2))
  9.                                         return 0;
  10.                                 else
  11.                                         return s1.compareTo(s2);
  12.                         }
  13.                 });
复制代码



3)从写了比较器中的方法后,就会出现键相同就不能存储的情况,这才是我们想要的也是达到题目中要求的前提。然后再存入集合的时候代码应该这样写。
  1. //将字符串切割成字符数组,并将切割的字符数组添加到map集合中,如果已经存在,值就+1,否者值就为1.
  2.                 for (String s : str.split(" "))
  3.                         map.put(s, map.containsKey(s)? map.get(s)+1 : 1);
复制代码
不知你能不能明白我的意思。



回复 使用道具 举报
kelin410 发表于 2016-4-12 01:07
好多大神支招啊!!!!!

我想知道我的错误在哪里
回复 使用道具 举报
好多大神支招啊!!!!!
回复 使用道具 举报
zw2008 中级黑马 2016-4-11 23:01:32
9#
lidandan 发表于 2016-4-10 22:51
楼上给出来的挺不错的

我想知道我的错在哪儿了
回复 使用道具 举报
楼上给出来的挺不错的
回复 使用道具 举报
package com.heima;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;


public class Test11 {

        /**
         * (1)统计每个单词出现的次数
                (2)有如下字符串"If you want to change your fate I think you must come to the dark horse to learn java"(用空格间隔)
                (3)打印格式:
                  to=3
                    think=1
                    you=2
                    
                    
                分析:
                1,通过切割字符串得到字符串数组
                2.创建双列结合存储字符串 和字符串出现的次数
                3.遍历数组判断双列集合的是否包含字符串数组中的每个元素如果不包含将该字符串作为键 ,1作为值存储到集合
                  如果包含则将该字符串作为键, 该键的值+1作为值 存储到集合
                4.遍历双列集合 得到结果
  * @param args
         */
        public static void main(String[] args) {
                //1,通过切割字符串得到字符串数组
                String s="If you want to change your fate I think you must come to the dark horse to learn java";
                String[] arr = s.split(" ");
                System.out.println(s);
                System.out.println(arr.length);
                //2.创建双列结合存储字符串 和字符串出现的次数
                LinkedHashMap<String , Integer> tm = new LinkedHashMap<>();
                //3.遍历数组判断双列集合的是否包含字符串数组中的每个元素
               
                for (String string : arr) {
                        if (tm.containsKey(string)) {
                                //如果包含则将该字符串作为键, 该键的值+1作为值 存储到集合
                                tm.put(string, (tm.get(string))+1);
                               
                        }else {//如果不包含将该字符串作为键 ,1作为值存储到集合
                                tm.put(string, 1);
                        }
                }
                //4.遍历双列集合 得到结果
                Set<Map.Entry<String,Integer>> set=tm.entrySet();
                for (Entry<String, Integer> entry : set) {
                        System.out.println(entry.getKey()+"出现了"+entry.getValue()+"次");
                }
        }

}
回复 使用道具 举报
package com.heima;  import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap;  public class Test11 {          /**          * (1)统计每个单词出现的次数                 (2)有如下字符串"If you want to change your fate I think you must come to the dark horse to learn java"(用空格间隔)                 (3)打印格式:                   to=3                     think=1                     you=2                                                           分析:                 1,通过切割字符串得到字符串数组                 2.创建双列结合存储字符串 和字符串出现的次数                 3.遍历数组判断双列集合的是否包含字符串数组中的每个元素如果不包含将该字符串作为键 ,1作为值存储到集合                   如果包含则将该字符串作为键, 该键的值+1作为值 存储到集合                 4.遍历双列集合 得到结果   * @param args          */         public static void main(String[] args) {                 //1,通过切割字符串得到字符串数组                 String s="If you want to change your fate I think you must come to the dark horse to learn java";                 String[] arr = s.split(" ");                 System.out.println(s);                 System.out.println(arr.length);                 //2.创建双列结合存储字符串 和字符串出现的次数                 LinkedHashMap<String , Integer> tm = new LinkedHashMap<>();                 //3.遍历数组判断双列集合的是否包含字符串数组中的每个元素                                  for (String string : arr) {                         if (tm.containsKey(string)) {                                 //如果包含则将该字符串作为键, 该键的值+1作为值 存储到集合                                 tm.put(string, (tm.get(string))+1);                                                          }else {//如果不包含将该字符串作为键 ,1作为值存储到集合                                 tm.put(string, 1);                         }                 }                 //4.遍历双列集合 得到结果                 Set<Map.Entry<String,Integer>> set=tm.entrySet();                 for (Entry<String, Integer> entry : set) {                         System.out.println(entry.getKey()+"出现了"+entry.getValue()+"次");                 }         }  }
回复 使用道具 举报
本帖最后由 z332406259 于 2016-4-10 20:55 编辑

再思考思考.
回复 使用道具 举报
你把重写的compare方法改为s1.compareTo(s2) 就可以了        原因楼上已经说了
回复 使用道具 举报
get方法是和比较器有关系的.他是通过比较器来找的.你把比较器设置为1.
那么他永远找不到你输出的值
回复 使用道具 举报
用if map.containskey(string)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马