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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© feng_pump 中级黑马   /  2016-9-20 22:24  /  1826 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

//从控制台接收一串字符串,完成以下要求 (共10分)
//a,求出该字符串的长度并输出到控制台,如字符串长度为:X
//b,将该字符串转为数组,判断该数组第一个字符和最后一个字符是否相同,不相同则交换
//c,统计出数组中的每个字符出现的次数,然后自然排序后按指定格式输出到控制台,如 a=3,b=4,c=4,d=3,e=2,f=1
//d,将第二步互换后的数组角标为奇数的字符用”*”号替换,然后遍历输出
//e,将数组中元素重新拼接成字符串,最后截取第一个'*'到第三个'*'之间的数据输出


解题思路:
a,第一个输出字符串很简单,直接调用length即可
b,转为数组的话,通过string的toarray方法即可,然后给出第一个和最后一个索引交换就ok
c,一般来说统计次数的话就要用到map,我比较喜欢用treemap,因为可以自然排序也可以通过comparable接口来自定义排序,方便
d,这一个的话遍历数组把奇数位的替换就可以了
e,这个我当时想了想,先是想在循环中得到索引,然后再通过索引来截取,但是后来发现怎么也实现不了,最后是通过在循环内截取才做成的

后边是我写的程序,如果有可以更完善的地方,希望大家指点指点!!

13 个回复

倒序浏览
public class Test1 {
        public static void main(String[] args) {
                //求出该字符串的长度并输出到控制台,如字符串长度为:X
                Scanner sc = new Scanner(System.in);
                String s = sc.nextLine();
                System.out.println("字符串长度为:"+s.length());
                //将该字符串转为数组,判断该数组第一个字符和最后一个字符是否相同,不相同则交换
                char[] chs = s.toCharArray();
                if(chs[0] != chs[chs.length-1]){
                        char temp = chs[0];
                        chs[0] = chs[chs.length -1];
                        chs[chs.length -1] = temp;
                }
                //统计出数组中的每个字符出现的次数,然后自然排序后按指定格式输出到控制台,如 a=3,b=4,c=4,d=3,e=2,f=1
                TreeMap<Character,Integer> tm = new TreeMap<>();
                for(int i = 0 ; i < chs.length; i ++) {
                        if(!tm.containsKey(chs[i])){
                                tm.put(chs[i], 1);
                        }else{
                                tm.put(chs[i], tm.get(chs[i])+1);
                        }
                }
                StringBuffer sb = new StringBuffer();
                for(Character c : tm.keySet()){
                        sb.append(c).append("=").append(tm.get(c)).append(",");
                }
                String ss = sb.substring(0,sb.length()-1);
                System.out.println(ss);
                //将第二步互换后的数组角标为奇数的字符用”*”号替换,然后遍历输出
                for(int i = 0 ; i < chs.length ; i++){
                        if(i%2 == 1){
                                chs[i] = '*';
                        }
                }
                for(char c : chs){
                        System.out.print(c);
                }
                System.out.println();
                //将数组中元素重新拼接成字符串,最后截取第一个'*'到第三个'*'之间的数据输出
                StringBuffer sb1 = new StringBuffer();
                int count = 0 ;
                for(int i = 0 ; i < chs.length ; i ++){
                        if(chs[i] == '*'){
                                count++;
                        }       
                        if(count >= 1 && count <= 3){
                                sb1.append(chs[i]);
                        }
                        if(count == 3){
                                break;
                        }
                }
                System.out.println(sb1);
        }
}
回复 使用道具 举报
学习了,看样子平常需要多多练习呀
回复 使用道具 举报
楼主好人,好人一生平安。
回复 使用道具 举报
好人一生平安
回复 使用道具 举报
大神的一定要光顾  谢谢分享
回复 使用道具 举报
[Java] 纯文本查看 复制代码
public class Test01 {

	/**
	 * * 从控制台接收一串字符串,完成以下要求 (共10分)
		a,求出该字符串的长度并输出到控制台,如字符串长度为:X
		b,将该字符串转为数组,判断该数组第一个字符和最后一个字符是否相同,不相同则交换
		c,统计出数组中的每个字符出现的次数,然后自然排序后按指定格式输出到控制台,如 a=3,b=4,c=4,d=3,e=2,f=1
		d,将第二步互换后的数组角标为奇数的字符用”*”号替换,然后遍历输出
		e,将数组中元素重新拼接成字符串,最后截取第一个'*'到第三个'*'之间的数据输出
	 */
	public static void main(String[] args) {
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		//提示用户输入
		System.out.println("请输入一段字符串:");
		//将键盘录入的字符串存储到line中
		String line = sc.nextLine();
		//a,求出该字符串的长度并输出到控制台,如字符串长度为:X
		System.out.println(line + "字符串的长度为:" + line.length());
		//将字符串转为字符数组
		char[] arr = line.toCharArray();
		//b,将该字符串转为数组,判断该数组第一个字符和最后一个字符是否相同,不相同则交换
		if (arr[0] != arr[arr.length - 1]) {
			char temp = arr[0];					//定义第三方变量,交换两个数组元素的位置
			arr[0] = arr[arr.length - 1];
			arr[arr.length - 1] = temp;
		}
		//创建一个字符数组的备份,用于排序
		char[] copy = arr.clone();
		Arrays.sort(copy);
		//c,统计出数组中的每个字符出现的次数,然后自然排序后按指定格式输出到控制台,如 a=3,b=4,c=4,d=3,e=2,f=1
		int count = 0;							//计数器,用于统计字符出现的次数
		StringBuffer sb = new StringBuffer();	//StringBuffer对象用于拼接输出结果
		for (int i = 0; i < copy.length;) {
			for (int j = i + 1; j < copy.length; j++) {
				if (copy[i] == copy[j]) {
					count ++ ;
				}else {
					sb.append(copy[i]).append("=").append(count+1).append(",");
					break;
				}
			}
			i += count + 1;						//跳过相同的字符序列
			count = 0;							//count清零,用于统计下一个字符出现的次数
		}
		System.out.println(sb.substring(0, sb.length()-1));
		//d,将第二步互换后的数组角标为奇数的字符用”*”号替换,然后遍历输出
		for (int i = 0; i < arr.length; i++) {
			if (i % 2 != 0) {
				arr[i] = '*';
			}
		}
		
		//增强for循环,遍历字符数组中的每一个元素
		for (char c : arr) {
			System.out.print(c);
		}
		System.out.println();
		
		//e,将数组中元素重新拼接成字符串,最后截取第一个'*'到第三个'*'之间的数据输出
		sb.delete(0, sb.length());
		String str = new String(arr);
		for (int index = 0; index < arr.length;) {
			index = str.indexOf("*", index);
			if (index == -1) {
				break;
			}
			sb.append(index);
			index += "*".length();
		}
		
		int start = Integer.parseInt(sb.substring(0, 1));
		int end = Integer.parseInt(sb.substring(2, 3));
		String newStr = str.substring(start + 1, end);
		System.out.println(newStr);
	}
}

回复 使用道具 举报
好人啊= =
回复 使用道具 举报
可以可以....
回复 使用道具 举报
谢谢楼主,学习了
[Java] 纯文本查看 复制代码
package com.heima;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

public class Text{

	/**
	 * 	/从控制台接收一串字符串,完成以下要求 (共10分)
		//a,求出该字符串的长度并输出到控制台,如字符串长度为:X
		//b,将该字符串转为数组,判断该数组第一个字符和最后一个字符是否相同,不相同则交换
		//c,统计出数组中的每个字符出现的次数,然后自然排序后按指定格式输出到控制台,如 a=3,b=4,c=4,d=3,e=2,f=1
		//d,将第二步互换后的数组角标为奇数的字符用”*”号替换,然后遍历输出
		//e,将数组中元素重新拼接成字符串,最后截取第一个'*'到第三个'*'之间的数据输出


	 */
	public static void main(String[] args) {
		//创建键盘输入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一串字符串:");
		//从键盘接收字符串
		String str = sc.nextLine();
		//求出字符串长度
		int length = str.length();
		System.out.println(length);
		//将字符串转换成数组
		char[] arr = str.toCharArray();
		//比较数组第一个字符和最后一个字符是否相同,不同就交换
		if (arr[0] != arr[arr.length-1]) {
			char c = arr[0];
			arr[0] = arr[arr.length-1];
			arr[arr.length-1] = c;
			}
		//控制台打印交换后的结果
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]);
		}
		System.out.println();
		//创建一个treemap集合,用来统计数组中各个元素出现的次数
		TreeMap<Character, Integer> map = new TreeMap<>();
		//遍历数组
		for (char c : arr) {
			//判断集合中有无此元素,如果没有,就添加,有的话,就将value值加1
			if (!map.containsKey(c)) {
				map.put(c, 1);
			}else {
				map.put(c, map.get(c)+1);
			}
		}
		
		//获取map集合的键值对对象
		Set<Map.Entry<Character, Integer>> se = map.entrySet();
		for (Entry<Character, Integer> entry : se) {
			System.out.print(entry.getKey()+"="+entry.getValue()+",");
		}
		System.out.println();
		//遍历集合,替换下标为奇数的元素
		for (int i = 0; i < arr.length; i++) {
			//把下标为奇数的元素用*替换
			if (i % 2 != 0) {
				arr[i] = '*';
			}
		}
		//遍历输出
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]);
		}
		System.out.println();
		//把数组转换成字符串
		String ss = arr.toString();
		//截取第一个'*'到第三个'*'之间的数据输出
		StringBuffer sb1 = new StringBuffer();
        int count = 0 ;
        for(int i = 0 ; i < arr.length ; i ++){
                if(arr[i] == '*'){
                        count++;
                }        
                if(count >= 1 && count <= 3){
                        sb1.append(arr[i]);
                }
                if(count == 3){
                        break;
                }
        }
        System.out.println(sb1);
	}
}

回复 使用道具 举报
好人一生平安
回复 使用道具 举报
public class Test01 {
        public static void main(String[] args) {
                // 控制台接收一串字符串
                String str = getString();
                System.out.println(str);
                // 字符串长度
                System.out.println("录入字符串长度为:" + str.length());
                // 获取字符数组
                char[] strArr = swap(str);
                System.out.println(strArr);
                // 替换奇数脚标的字符
                char[] newArr = replaceChar(strArr);
                System.out.println(newArr);
                // 截取字符串
                String s = result(newArr);
                System.out.println(s);
                String result = s.substring(1, 6);
                System.out.println(result);

        }

        // 截取字符串
        public static String result(char[] ch) {
                String str = "";
                for (int i = 0; i < ch.length; i++) {
                        str = str + ch[i];
                }
                return str;
        }

        // 替换奇数脚标的字符
        public static char[] replaceChar(char[] ch) {
                for (int i = 0; i < ch.length; i++) {
                        if (i % 2 != 0) {
                                ch[i] = '*';
                        }
                }
                return ch;
        }

        // 交换字符
        public static char[] swap(String str) {
                char[] strArr = str.toCharArray();
                if (strArr[0] != strArr[strArr.length - 1]) {
                        char temp;
                        temp = strArr[0];
                        strArr[0] = strArr[strArr.length - 1];
                        strArr[strArr.length - 1] = temp;
                }
                return strArr;
        }

        // 接收键盘录入数据
        public static String getString() {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入内容:");
                String line = sc.nextLine();
                return line;
        }
}
回复 使用道具 举报
public class Test1 {

        /**
         * 从控制台接收一串字符串,完成以下要求:
         * a,求出该字符串的长度并输出到控制台,如字符串长度为:X
          b,将该字符串转为数组,判断该数组第一个字符和最后一个字符是否相同,不相同则交换
          c,统计出数组中的每个字符出现的次数,然后自然排序后按指定格式输出到控制台,如   a=3,b=4,c=4,d=3,e=2,f=1
          d,将第二步互换后的数组角标为奇数的字符用”*”号替换,然后遍历输出
          e,将数组中元素重新拼接成字符串,最后截取第一个'*'到第三个'*'之间的数据输出(注意:两边都包含'*')

         */
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入一串字符串:");
               
                String line = getlength(sc);
               
                char[] arr = change1(line);
               
                getTime(arr);
               
                change2(arr);
               
                System.out.println("-------");
               
                String s = new String(arr);
                String s2 = s.substring(1, 6);
                System.out.println(s2);
        }

        private static void change2(char[] arr) {
                for (int i = 0; i < arr.length; i++) {
                        if (i%2 != 0) {
                                arr[i] ='*';
                        }
                       
                }
                System.out.print(arr);
        }

        private static void getTime(char[] arr) {
                TreeMap<Character, Integer> tm = new TreeMap<>();
                for (char c : arr) {
                        if (!tm.containsKey(c)) {
                                tm.put(c,1);
                        }else {
                                tm.put(c, tm.get(c)+1);
                        }               
                }
                for (Character key : tm.keySet()) {
                        System.out.print(key + "="+ tm.get(key)+",");
                }
        }

        private static char[] change1(String line) {
                char[] arr = line.toCharArray();
                if (arr[0] != arr[arr.length-1]) {
                        char temp = arr[0];
                        arr[0] = arr[arr.length-1];
                        arr[arr.length-1] = temp;
                }
                System.out.println(arr);
                return arr;
        }

        private static String getlength(Scanner sc) {
                String line = sc.nextLine();
                System.out.println(line.length());
                return line;
        }       

}
回复 使用道具 举报
学习一波~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马