黑马程序员技术交流社区

标题: 程序错误求助!!! [打印本页]

作者: zw2008    时间: 2016-4-9 00:11
标题: 程序错误求助!!!
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
错误在哪啊实在找不到







作者: 性感不是骚    时间: 2016-4-9 00:35
用if map.containskey(string)
作者: 荒丶    时间: 2016-4-9 09:27
get方法是和比较器有关系的.他是通过比较器来找的.你把比较器设置为1.
那么他永远找不到你输出的值
作者: wx_Zdt18Ww6    时间: 2016-4-10 19:05
你把重写的compare方法改为s1.compareTo(s2) 就可以了        原因楼上已经说了
作者: z332406259    时间: 2016-4-10 20:46
本帖最后由 z332406259 于 2016-4-10 20:55 编辑

再思考思考.
作者: 陈文广    时间: 2016-4-10 21:38
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()+"次");                 }         }  }
作者: 陈文广    时间: 2016-4-10 21:39
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()+"次");
                }
        }

}
作者: lidandan    时间: 2016-4-10 22:51
楼上给出来的挺不错的
作者: zw2008    时间: 2016-4-11 23:01
lidandan 发表于 2016-4-10 22:51
楼上给出来的挺不错的

我想知道我的错在哪儿了
作者: kelin410    时间: 2016-4-12 01:07
好多大神支招啊!!!!!
作者: zw2008    时间: 2016-4-12 22:00
kelin410 发表于 2016-4-12 01:07
好多大神支招啊!!!!!

我想知道我的错误在哪里
作者: kelin410    时间: 2016-4-13 01:16
你错在哪里了?这个要先弄清楚你所说的错是哪个错误。因为你的代码错误不止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);
复制代码
不知你能不能明白我的意思。




作者: NB的笨小孩    时间: 2016-4-13 06:49
不错,看评论,也跟着学习一下
作者: zw2008    时间: 2016-4-13 21:05
kelin410 发表于 2016-4-13 01:16
你错在哪里了?这个要先弄清楚你所说的错是哪个错误。因为你的代码错误不止1处。
1)首先我猜测你是为为什 ...

我好好看看
作者: lidandan    时间: 2016-4-13 22:18
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

作者: zw2008    时间: 2016-4-14 19:41
lidandan 发表于 2016-4-13 22:18
1,首先你先把TreeMap换成HashMap集合,因为没有强制要求,你就用HashMap呗
2,把String, Integer>(new Com ...

十分感谢
作者: 豆豆斌    时间: 2016-4-15 09:06
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);         }
作者: kelin410    时间: 2016-4-17 20:59
zw2008 发表于 2016-4-13 21:05
我好好看看

还有一点忘记了,你集合中的键是String。不需要使用比较器。因为String中已经具备比较功能了!
作者: kelin410    时间: 2016-4-17 21:20
zw2008 发表于 2016-4-13 21:05
我好好看看

我把我写的给你看下吧!
  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. }
复制代码

作者: zw2008    时间: 2016-4-17 21:50
kelin410 发表于 2016-4-17 21:20
我把我写的给你看下吧!

大神 膜拜一下




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