黑马程序员技术交流社区

标题: 作业题,求解,各种思路 [打印本页]

作者: SunCowbee    时间: 2016-9-10 01:08
标题: 作业题,求解,各种思路
分析以下需求,并用代码实现:
        (1)利用键盘录入,输入一个字符串
        (2)统计该字符串中各个字符的数量
        (3)如:
                用户输入字符串"If~you-want~to~change-your_fate_I_think~you~must~come-to-the-dark-horse-to-learn-java"
                程序输出结果:-(9)I(2)_(3)a(7)c(2)d(1)e(6)f(2)g(1)h(4)i(1)j(1)k(2)l(1)m(2)n(4)o(8)r(4)s(2)t(8)u(4)v(1)w(1)y(3)~(6)


作者: tliangl928    时间: 2016-9-10 06:58
首先创建一个map集合,用来接收键值(字符和个数),把字符串中的每个字符拿出来,判断是否包含,包含就是个数+1,不包含就添加进去。      map.entryset();遍历结果,创建stringbuffer字符串缓冲区接收键值,拼接成想要的结果,最后字符串缓冲对象.tostring输出即可。
作者: 370452158    时间: 2016-9-10 11:19
[AppleScript] 纯文本查看 复制代码
public class test {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入");
                TreeMap<Character, Integer> tm = new TreeMap<>();

                String s = sc.nextLine();
                char[] arr = s.toCharArray();
                for (char c : arr) {
                        if (!tm.containsKey(c)) {
                                tm.put(c, 1);
                        } else {
                                tm.put(c, tm.get(c) + 1);
                        }
                }
                for (char c : tm.keySet()) {
                        System.out.println(c+" "+tm.get(c));
                }
        }
     
}

作者: zwy1174    时间: 2016-9-10 22:31
                TreeMap<Character, Integer> map = new TreeMap<Character, Integer>();
                for (Character key : new Scanner(System.in).next().toCharArray()) {
                        map.put(key, !map.containsKey(key)?1:map.get(key)+1);
                }
                for (Character key : map.keySet()) {
                        System.out.print(key+"("+map.get(key)+")");
                }
作者: Zzh94520    时间: 2016-9-10 22:32
6666666666666
作者: jiubaK    时间: 2016-9-10 23:09
我看到上面已经有很好的回答,也就不附上自己的代码了。
不过,我还是要指出,
上面的同学都用到了containsKey方法,不过这个题上,我并不建议使用它,虽然我们上课的视频上也用了它(PS:我是双元课堂学生)。
这个方法底层代码是:
[Java] 纯文本查看 复制代码
public boolean containsKey(Object key) {
        return getEntry(key) != null;
}

所以其实它是遍历了一下内部数据的,当然不看源码也能想到。
下面是get方法的底层代码
[Java] 纯文本查看 复制代码
public V get(Object key) {
        if (key == null)
                return getForNullKey();
        Entry<K,V> entry = getEntry(key);

        return null == entry ? null : entry.getValue();
}

显然它再去遍历了一次。
所以为了获取已经存入的某个字符的个数,我们进行了2次遍历。
其实我们可以直接通过get去获取,如果不存在,得到的就是null,那么我们存入对应值为1即可,否则将原次数+1再存入。(我觉得这样做更好)
有同学说,HashMap是可以存入null值的,万一之前就存在这种情况:一个字符为键对应的值为null呢?
这个根本也就没有意义,且不说我们本就不会存入null值,即使存入了,视为0次不也行吗?
Integer n = map.get( key );
if( n == null ) n = 0;
map.put( key, n + 1 );
所以,这个题目,我们没有必要去判断是否存在某个键。
当然,其它题目可能是需要的。
作者: SunCowbee    时间: 2016-9-11 00:39
谢大神们的正解




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