统计小写字母个数,按序输出星花
【问题描述】:
编写程序从标准输入中读取一行英文,统计其中小写字母的出现次数,并按照从小到大的顺序以条状图的形式显示其出现次数,出现次数为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");
}
}
三组结果测试:
整体代码演示:
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");
}
}
}
}