字符和字符串
1.字符char
1.1 char对应的封装类
package pack6;
public class CharTest {
public static void main(String args[]) {
char a = '我';//用单引号,只能有一个字符
//装箱:类类型=基本数据类型
Character a1 = a;
//拆箱 基本数据类型=类类型
a = a1;
}
}
1.2 Character常见方法
package pack6;
public class CharTest {
public static void main(String args[]) {
System.out.println(Character.isLetter('a'));//判断是否为字母
System.out.println(Character.isDigit('a'));//判断是否为数字
System.out.println(Character.isWhitespace(' '));//是否是空格
System.out.println(Character.isUpperCase('A'));//是否大写
System.out.println(Character.isLowerCase('a'));//是否小写
System.out.println(Character.toUpperCase('a'));//转换为大写
System.out.println(Character.toLowerCase('A'));//转换为小写
//把字符转换为字符串
String a2=Character.toString('a');
System.out.println(a2);
}
}
1.3 练习 字符串转字符串数组
import java.util.Scanner;
public class CharTest {
public static void main(String args[]) {
Scanner reader=new Scanner(System.in);
String str=reader.next();
// 字符串转字符串数组 toCharArray()方法
char[] cs=str.toCharArray();
System.out.println(cs);
}
}
2.字符串
2.1 练习 生成随机的字符串
public class CharTest {
public static void main(String args[]) {
String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//随机的数字,字母
Random random=new Random();//Random对象
StringBuffer sb=new StringBuffer();//StringBuffer对象
for(int i=0;i<5;i++){ //生成5个字符
int number=random.nextInt(62);//str的长度
sb.append(str.charAt(number));//字符串添加
}
System.out.println(sb);
}
}
2.2 练习
创建一个长度是8的字符串数组
使用8个长度是5的随机字符串初始化这个数组
对这个数组进行排序,按照每个字符串的首字母排序(无视大小写)
注1: 不能使用Arrays.sort() 要自己写
注2: 无视大小写,即 Axxxx 和 axxxxx 没有先后顺序
package pack6;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class CharTest {
public static String getstr() {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机的字母
Random random = new Random();//Random对象
StringBuffer sb = new StringBuffer();//StringBuffer对象,可变字符串
String s = "";
for (int i = 0; i < 5; i++) { //生成5个字符
int number = random.nextInt(52);//随机生成0到51的数字 [0,51)
sb.append(str.charAt(number));//往数组StringBuffer中append对象
}
s = sb.toString();//转成String
return s;
}
public static void main(String args[]) {
String[] stringBuffers = new String[8];
for (int i = 0; i < stringBuffers.length; i++) {
stringBuffers[i] = getstr();
}
System.out.println(Arrays.toString(stringBuffers));//生成8个长度为5的字符串
//冒泡排序
for (int i = 0; i < stringBuffers.length - 1; i++) {
for (int j = i + 1; j < stringBuffers.length; j++) {
char[] char1 = stringBuffers[i].toCharArray();
char[] char2 = stringBuffers[j].toCharArray();
//获取首字母,把首字母转换为小写 按首字母排序
char1[0] = Character.toLowerCase(char1[0]);
char2[0] = Character.toLowerCase(char2[0]);
//由小到大排序 就交换A>B的
//由大到小排序 就交换A<B的
if (char1[0] > char2[0]) {
String st = stringBuffers[i];
stringBuffers[i] = stringBuffers[j];
stringBuffers[j] = st;
}
}
}
//打印排序后
System.out.println(Arrays.toString(stringBuffers));
}
}
运行结果
2.3 练习-穷举法破解密码
- 生成一个长度是3的随机字符串,把这个字符串作为当做密码
- 使用穷举法生成长度是3个字符串,匹配上述生成的密码
要求: 分别使用多层for循环 和 递归解决上述问题
for循环解决问题
package pack6;
import java.util.Random;
public class CharTest {
static String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机的字母和数字
public static String getstr() {
Random random = new Random();//Random对象
StringBuffer sb = new StringBuffer();//StringBuffer对象,可变字符串
String s = "";
for (int i = 0; i < 3; i++) { //生成5个字符
int number = random.nextInt(52);//随机生成0到51的数字 [0,51)
sb.append(str.charAt(number));//往数组StringBuffer中append对象
}
s = sb.toString();//转成String
return s;
}
public static void main(String args[]) {
String code=getstr();
System.out.println("密码是:"+code);
//三重循环 暴力枚举
for(int i=0;i<str.length();i++){
for(int j=0;j<str.length();j++){
for(int k=0;k<str.length();k++){
//字符转字符串
String guess=Character.toString(str.charAt(i))+Character.toString(str.charAt(j))+Character.toString(str.charAt(k));
if(guess.equals(code)){
System.out.println("猜到了,密码是:"+guess);
}
}
}
}
}
}
递归解决问题
package pack6;
import java.util.Random;
public class CharTest {
static String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//随机的字母和数字
static char[] ch = new char[3]; //3位密码数组
static String pw; //密码的中间值
static boolean flag = false;//判断有没有找到
// 递归方法枚举
// ch有三位 在62个中随便找一个放在第三位 在62个中随便找一个放在第二位 在62个中随便找一个放在第1位
public static String getPassword(String code, int n) {
//外部循环 遍历62次(共有62个字符)
for (int i = 0; i < 62; i++) {
ch[n - 1] = str.charAt(i);//把str的字符赋值给ch
pw = new String(ch);//新生成一个pw字符串
if (n != 1) pw = getPassword(code, n - 1);// 密码长度是3 此时长度未到3
else {
//此时找到3个密码了
if (code.equals(pw)) {
flag = true;//设置状态
}
}
//根据状态返回
if (flag) return pw;
}
//没有找到 返回pw
return pw;
}
public static String getstr() {
Random random = new Random();//Random对象
StringBuffer sb = new StringBuffer();//StringBuffer对象,可变字符串
String s = "";
for (int i = 0; i < 3; i++) { //生成5个字符
int number = random.nextInt(52);//随机生成0到51的数字 [0,51)
sb.append(str.charAt(number));//往数组StringBuffer中append对象
}
s = sb.toString();//转成String
return s;
}
public static void main(String args[]) {
String code = getstr();
System.out.println("密码是:" + code);
String res = getPassword(code, 3);
System.out.println(res);
}
}