天天看點

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;
	}
	
	//遞歸還沒想通^_^
}