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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SunCowbee 中级黑马   /  2016-9-10 01:08  /  1728 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

分析以下需求,并用代码实现:
        (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)

6 个回复

倒序浏览
首先创建一个map集合,用来接收键值(字符和个数),把字符串中的每个字符拿出来,判断是否包含,包含就是个数+1,不包含就添加进去。      map.entryset();遍历结果,创建stringbuffer字符串缓冲区接收键值,拼接成想要的结果,最后字符串缓冲对象.tostring输出即可。
回复 使用道具 举报
[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));
		}
	}
     
}
回复 使用道具 举报
                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)+")");
                }
回复 使用道具 举报
6666666666666
回复 使用道具 举报
我看到上面已经有很好的回答,也就不附上自己的代码了。
不过,我还是要指出,
上面的同学都用到了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 );
所以,这个题目,我们没有必要去判断是否存在某个键。
当然,其它题目可能是需要的。
回复 使用道具 举报
谢大神们的正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马