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;
}
//递归还没想通^_^
}