读入一行英文,统计每个小写字母的出现次数,并按照由小到大的顺序以条状图的形式输出,次数为0的不输出(附完整代码)

统计小写字母个数,按序输出星花

【问题描述】:

编写程序从标准输入中读取一行英文,统计其中小写字母的出现次数,并按照从小到大的顺序以条状图的形式显示其出现次数,出现次数为0的不输出。

【输入形式】:

在标准输入上输入一行英文。

【输出形式】:

在屏幕上按照从小到大的顺序输出表示每个小写字母出现次数的条状图(以 * 字符表示条状图,某个小写字母出现了多少次,就显示多少字符;出现次数为0的不输出。

【样例输入】:

abbcccddd

【样例输出】:

对应的星花个数

代码思路分析及编写:

1,我们要解决的问题是标准输入,三步(导包,创建Scanner对象,调用对象来接受键盘输入):

Scanner sc1 = new Scanner(System.in);
String st1 = sc1.nextLine();

2,题目中有很明显的映射关系要求,不同的字母,对应不同的次数,所以我们使用Map,键值是Character类型的字母,Value值是Integer类型的次数

//第一步,创建map
Map<Character,Integer> m = new HashMap<Character, Integer>(); 

3,创建好Map后,我们需要对Map进行初始化,即键值为a–>z,Value全为0

//第二步,对map进行初始化  a是97,z是122
for(int i = 97;i<123;i++) {
	m.put((char)i, 0);
}

4,输入的字符串分解为字符,并依次放到Map中进行统计,我们需要使用字符串的length函数将字符串进行索引遍历。再使用字符串的charAt函数找到对应的字母。使用if判断是否为小写,是小写字母,使我们要找的并且Map中有,继续操作;不是小写字母,不管。直接取出该字母的个数,自加一后,放回。

//第三步,将输入的字符串分解为字符,并依次放到map中进行统计
for(int i =0;i<st1.length();i++) {
	char ch = st1.charAt(i);
	if(ch>='a'&&ch<='z') {
		int result = m.get(ch);
		result = result + 1;
		m.put(ch, result);
	}
}

5,统计完成后,我们需要进行排序,这里使用的是传统冒泡排序,写一个sort的函数,参数为Map类型。我们需要将Map中的映射对给拆开,也就是放到一个集合中,使用泛型为Map.Entry的集合进行接收,同时要将接收的映射对添加到ArrayList列表中。

ArrayList<Map.Entry<Character, Integer>> a1 = new ArrayList<Map.Entry<Character,Integer>>();
Set<Map.Entry<Character, Integer>>ss = m.entrySet();
		for(Map.Entry<Character, Integer>en:ss) {
			a1.add(en);
		}

6,传统冒泡排序算法对接受了映射对的列表进行排序,这里是由小到大排序的:

for(int i =0;i<a1.size()-1;i++) {
	for(int j =0;j<a1.size()-1-i;j++) {
		if(a1.get(j).getValue()>a1.get(j+1).getValue()) {
			Map.Entry<Character, Integer>temp = a1.get(j);
			a1.set(j, a1.get(j+1));
			a1.set(j+1, temp);
		}
	}
}

7,将排好序的列表进行输出,这里注意一个题目条件,次数为0的不输出,所以我们在输出之前需要判断一下列表当前映射对的值是否为0:

for(int i =0;i<a1.size();i++) {
	if(a1.get(i).getValue()!=0) {
		for(int j =0;j<a1.get(i).getValue();j++) {
			System.out.print("*");
		}
		System.out.println("\t");
	}
}

三组结果测试:

输入测试abbcccdddd
输入测试dccbbbaaaa
输入测试abcdabcaba

整体代码演示:

package cn.tedu.day01;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main {
	public static void main(String[] args) {
		Scanner sc1 = new Scanner(System.in);
		System.out.println("请输入一段英语");
		String st1 = sc1.nextLine();
		Map<Character, Integer> m = new HashMap<Character, Integer>();
		for(int i = 97;i<123;i++) {
			m.put((char) i, 0);
		}
		for(int i =0;i<st1.length();i++) {
			char ch = st1.charAt(i);
			int result = m.get(ch);
			result = result +1;
			m.put(ch, result);
		}
		sort(m);
	}
	public static void sort(Map<Character, Integer>m) {
		ArrayList<Map.Entry<Character, Integer>> a1 = new ArrayList<Map.Entry<Character,Integer>>();
		Set<Map.Entry<Character, Integer>>ss = m.entrySet();
		for(Map.Entry<Character, Integer>en:ss) {
			a1.add(en);
		}
		for(int i =0;i<a1.size()-1;i++) {
			for(int j =0;j<a1.size()-1-i;j++) {
				if(a1.get(j).getValue()>a1.get(j+1).getValue()) {
					Map.Entry<Character, Integer>temp = a1.get(j);
					a1.set(j, a1.get(j+1));
					a1.set(j+1, temp);
				}
			}
		}
		for(int i =0;i<a1.size();i++) {
			if(a1.get(i).getValue()!=0) {
				for(int j =0;j<a1.get(i).getValue();j++) {
					System.out.print("*");
				}
				System.out.println("\t");
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢泽浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值