题目叙述:(该题来源自how 2J 教程) 创建一个长度是100的字符串数组 使用长度是2的随机字符填充该字符串数组 统计这个字符串数组里重复的字符串有多少种
自己所写代码示例:
package test;
public class SomeString {
public static String suiji(int m) {
String str="";
String news="";
for (short i = '0'; i <='9' ; i++) {
str+=(char)i;
}
for(short i='a';i<='z';i++)
{
str+=(char)i;
}
for(short i='A';i<='Z';i++)
{
str+=(char)i;
}
for(int i=0;i<m;i++)
{
int ch=(int)(Math.random()*str.length());
char ch1=str.charAt(ch);
String anch=Character.toString(ch1);
news+=anch;
}
return news;
}
public static void main(String[] args) {
String [] str1=new String[100];
int sum=0;
String h1="";
for(int i=0;i<str1.length;i++)
{
str1[i]=suiji(2)+" ";
if(i%20==0)
{
System.out.println();
}
System.out.printf("%s",str1[i]);
}
System.out.println();
for(int j=0;j<str1.length-1;j++)
{
for(int k=j+1;k<str1.length;k++)
{
if(str1[j].equals(str1[k]))
{
sum++;
h1+=str1[j];
}
}
}
System.out.printf("一共有%d种重复的字符串",sum);
System.out.println();
System.out.println("分别是:");
System.out.println(h1);
}
}
首先:方法suiji(); 其主要作用是产生随机数 但我这段代码也是借鉴他人带代码通过理解后码出的 大体一样 但当我看了另一个的这段随机数产生代码瞬间就觉得自己的代码不够精简。
以下是另一随机数产生的代码示例:
public static String randomStr(int n){
char cs[] = new char[n];
for(int i=0;i<n;i++){
while(true){
char c = (char)(Math.random()*('z'+1-'0')+'0');
if(Character.isLetterOrDigit(c)){
cs[i]=c;
break;
}
}
}
return new String(cs);
}
区别: 1、我的特点在于 : 先定义一个空串 之后通过for循环在0到9 a到z A到Z 进行填充以此成为完整字符串 接着利用Math.random() 产生随机浮点数(0到1之间)乘以数组长度 强转int型 得到随机数 调用charAt();放入随机数 获取随机字符强转为字符串再新定义空字符串 把一个个拼接在一起 返回。 2、他的特点: 首先是自定义的字符数组 利用for 循环进行赋值,这是大致的思路。 细节之处在于 他没有去找一个随机数 而是同在0到1 a到z A到Z 中作加减法得到差值的基础上再加上起始字符结果再乘以Math.random();获取随机ASCll码 之后强转char型再在返回的时候转换成String 即可得到。 相比之下他这个精简多了 还加了一层判断保险: Java Character isLetterOrDigit()方法 java.lang.Character.isLetterOrDigit(int codePoint) 确定指定字符(Unicode代码点)是一个字母或数字。
字符被确定是字母或数字,如果不是isLetter(codePoint) 也不是 isDigit(codePoint) 的字符,则返回true。
主方法思路: 其实重点在于 调用suiji(); 方法 定义长度为100 的字符串数组之后再进行挨个赋值 得到100个随机的字符串数组 接着 就是for循环嵌套 穷举法挨个挨个判断是否重复 剩下的就是格式输出了
|