/*
* 创建一个长度是100的字符串数组,
* 使用长度是2的随机字符填充该字符串数组,
* 统计这个字符串数组里重复的字符串有多少种(忽略大小写)
* */
知识点:使用循环生成随机字符串
public static void main(String[] args) {
String[] ss=new String[100];
//初始化字符串数组
for (int i = 0; i < ss.length; i++) {
ss[i]=randomString(2);
}
//打印字符串数组
for (int i = 0; i < ss.length; i++) {
System.out.print(ss[i]+" ");
if(19==i%20) //每次打印到第20个之后换行
System.out.println();
}
//调用方法判断是否有重复的字符串
judgeString(ss);
}
//该函数用来生成一个长度为length的随机字符串
private static String randomString(int length) {
//字符串str保存所有字母字符和数字字符,用来生成随机字符串
String str="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//实例化一个random对象
Random random=new Random();
//实例化一个StringBuilder对象,用来保存生成的随机字符串
StringBuilder sb=new StringBuilder();
//通过循环生成长度为length的随机字符串
for(int i=0;i<length;i++) {
//利用random.nextInt(int number)方法,生成一个介于[0,number)之间的随机数
int number=random.nextInt(62); //生成一个[0,62)之间的随机数
//根据数字number在字符串str中找到这个字符,然后插入到sb中
sb.append(str.charAt(number));
}
//将sb转换成字符串类型并返回
return sb.toString();
}
//判断字符串数组中重复出现的字符串有多少个
private static void judgeString(String[] ss) {
int same; //用来标记是否找到相同的字符串
//拿出一个字符串与所有的字符串进行比较
for (int i = 0; i < ss.length-1; i++) {
same=0;
//从后一个字符串开始进行比较
for (int j = i+1; j < ss.length; j++) {
//如果找到了相等的字符串
if(ss[i].equalsIgnoreCase(ss[j])) {
//调用findSameStr方法,并结束这次循环
findSameStr(ss[i]);
same=1;
}
}
//如果找到了重复的字符,那么直接跳出外层循环
if(1==same)
break;
}
}
//定义一个全局变量用来计算重复的字符串的个数
static int count=0;
private static void findSameStr(String str) {
//定义一个字符串数组来保存重复的字符串
String[] sameStr=new String[100];
if(0==count) { //如果存入的是第一个重复的字符串,则直接存入sameStr数组中
sameStr[count++]=str;
}
else { //否则进行判断
for(int i=0;i<count;i++) {
/*
* 在这里进行判断的原因是:
* 字符串数组中重复的字符串可能有多个,也就是说在这一步要存入的字符串,
* 可能在之前的循环中已经作为第一次出现的字符串被存放进去了,
* 所以在这里要判断现在存入的字符串是否在之前已经存放过了
* */
if(sameStr[i].equalsIgnoreCase(str)) {
break;
}else { //否则将其存入到字符串数组中
sameStr[count++]=str;
}
}
}
System.out.printf("总共有%d种重复的字符串",count);
System.out.println("分别是:");
for (int i = 0; i < count; i++) {
System.out.print(sameStr[i]+" ");
}
}