天天看点

HOW2J——JAVA基础——String练习1

1、从字符串中筛选元素打印

import java.util.Scanner;
/*
从控制台读取字符串,然后把字符串转换为字符数组
筛选出控制台读取到的字符串中的大写字母和数字,并打印出来
*/
public class PrintElement {
    public static void main(String[] args) {
    	//通过Scanner的nextLine()方法从控制台读取一行字符串
    	Scanner input=new Scanner(System.in);
    	String s=input.nextLine();
    	//将字符串转换为字符数组
    	char[] arr=s.toCharArray();
    	//打印字符数组中的大写字母和数字
    	for(char c:arr){
    		if(Character.isUpperCase(c)||Character.isDigit(c)){
    			System.out.print(c);
    		}
    	}
    }
}
           

2、随机初始化字符串、字符串数组排序

/*
创建一个长度是8的字符串数组,使用8个长度是5的随机字符串初始化这个数组;
随机字符有可能是数字,大写字母或者小写字母;
对这个数组进行排序,按照每个字符串的首字母排序(无视大小写)
 */
public class StringTest {

	public static void main(String[] args) {
		//创建长度为8的字符串数组,每个字符串长度是5
		int arrLen=8;
		int strLen=5;
		String[] str=getStringArray(arrLen,strLen);
		printStringArray(str);
		
		//对字符串数组进行排序
		stringArraySort(str);
		printStringArray(str);
	}
	
	//生成一个保存所有数字、大小写字母的字符串
	//char[] list="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	//直接这样是不是更好
	public static String strList(){
		StringBuilder s=new StringBuilder();
		
		//添加1~9
		for(char c='0';c<='9';c++){
			s.append(c);
		}
		
		//添加'a'~'z'
		for(char c='a';c<='z';c++){
			s.append(c);
		}
		
		//添加'A'~'Z'
		for(char c='A';c<='Z';c++){
			s.append(c);
		}
		
		return s.toString();
	}
	
	//生成指定长度的随机字符串
	public static String getString(int length){
		String str=strList();//保存数字、大小写字母的字符串
		//System.out.println(str);测试程序
		int strLength=str.length();
		
		//生成长度为length的字符数组
		char[] ch=new char[length];
		for(int i=0;i<length;i++){
			int j=(int)(Math.random()*strLength);
			ch[i]=str.charAt(j);	
		}
		
		return String.valueOf(ch);
	}
	
	//创建指定长度m的字符串数组,并进行随机初始化,每个字符串长度n
	public static String[] getStringArray(int m,int n){
		String[] str=new String[m];
		for(int i=0;i<m;i++){
			str[i]=getString(n);
		}
		return str;
	}
	
	//对字符串数组进行排序,无视大小写,选择排序
	public static void stringArraySort(String[] str){
		for(int i=0;i<str.length-1;i++){
			for(int j=i+1;j<str.length;j++){
				if(str[i].compareToIgnoreCase(str[j])>0){
					String temp=str[i];
					str[i]=str[j];
					str[j]=temp;
				}
			}
		}
	}
	
	//打印字符串数组
	public static void printStringArray(String[] str){
		System.out.print("{"+str[0]);
		for(int i=1;i<str.length;i++){
			System.out.print(", "+str[i]);
		}
		System.out.println("}");
	}
}
           

3、穷举法破解密码

/*
1. 生成一个长度是3的随机字符串,把这个字符串作为当做密码
2. 使用穷举法生成长度是3个字符串,匹配上述生成的密码
要求:分别使用多层for循环和递归解决上述问题
 */
public class Decode {
	
	public static void main(String[] args) {
		//生成长度是3的随机字符串,假设仅含有数字和大小写字母
		//用StringTest中的getString方法
		String password=StringTest.getString(3);
		System.out.println("password=\""+password+"\"");
		String decode=decode1(password);
		System.out.println("decode=\""+decode+"\"");
	}
	
	//使用多层for循环解密
	//为什么要多层循环呢?是不是密码字符串不能转变为字符数组?然后就可以一位一位判断了
	public static String decode1(String password){
		//list保存密码中所有可能的字符,调用StringTest中的strList方法
		char[] list=(StringTest.strList()).toCharArray(); 
		int len=list.length;
		
		for(int i=0;i<len;i++){
			for(int j=0;j<len;j++){
				for(int k=0;k<len;k++){
					char[] ch={list[i],list[j],list[k]};
					String decode=new String(ch);
					if(decode.equals(password))
						return decode;
				}
			}
		}
		return null;
	}
	
	//递归还没想通^_^
}