这里想说的是:独立面对一个问题时,完全没有思路,学过的知识点不能活学活用,很多知识点需要看到别人的提示才能想起来,而自己不能灵活的运用,这应该是编程思想锻炼的还不够,通过多练应该可弥补,见的多了,练得多了,自然也就会形成自己的一套编程习惯。共勉吧,幕友们。
/****知识点总结****/
1,关键是能否想到建立一个用于产生随机字符的基准字符串 String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
2,随机类 Random的使用,以及常用的产生随机数的方法 nextInt(n); 以及对这个方法的灵活使用,例如:子字符串长度使用该方法产生,但随机字符的选取该怎处理?能否想到使用String类的 charAt(index)方法从基准字符串s中获取随机字符,那么对应的 随机位置 index 是否也能想到使用 nextInt(s.length()) 得到 这是本练习的关键。
3,StringBuilder 类的使用(长度可变,字符串可变 虽然不是线程安全的,单效率高,比较常用) append() 方法的使用。
4,Collections 工具类中 sort() 方法的使用。
5,List 集合接口的使用,常用的实现类 ArrayList (有序可重复)。
package randomStringSort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class TestRandomStringSort {
/**
* 默认排列顺序是:
* 0-9
* A-Z
* a-z
*/
//创建 泛型 ArrayList 实例 List 是接口,因此只能用实现它的子类来实例化对象
List<String> stringList = new ArrayList<String>();
//创建私有 基本字符串 s 用于产生随机子字符串
private String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
//创建全局静态 TestRandomStringsort 实例
static TestRandomStringSort trss = new TestRandomStringSort();
//创建 Random 类实例
private Random random = new Random();
public static void main(String[] args) {
//调用 添加随机字符串方法
trss.addRandomString();
//调用 排序方法
trss.StringSort();
}
private void StringSort() {
System.out.println("-------------排序前---------------");
for (int i = 0; i < 10; i++) {
System.out.println("元素:"+ stringList.get(i));
}
//调用 Collections工具类的sort()方法
Collections.sort(stringList);
System.out.println("-------------排序后---------------");
for (int i = 0; i < 10; i++) {
System.out.println("元素:"+ stringList.get(i));
}
}
//添加随机字符串方法
private void addRandomString() {
String subString;
for (int i = 0;i<10;i++) {
do {
//调用生成 长度为10以内随机整数的子字符串的方法
subString = trss.generateSubString();
} while (stringList.contains(subString));//判断子串是否重复
stringList.add(subString);
System.out.println("将要添加字符串:"+ "'" + subString + "'");
}
}
//生成随机字符串方法
private String generateSubString() {
//使用nextInt()方法生成一个10以内的随机整数,即字符串的随机长度 范围[0,10)
int randomNum = random.nextInt(10);
//StringBuilder 虽然线程不安全的,但效率高 创建一个sb实例,用于产生随机长度的字符串
StringBuilder sb = new StringBuilder();
//产生随机子字符串
if (randomNum == 0) {//若子字符串长度为0 则加1 保证 随机产生的子字符串 不为null
randomNum = 1;
}
for (int i = 0;i<randomNum;i++) {
//产生随机子串,每个字符也是从s基串中随机位置获得的
/**
* 随机字符串的每个字符都是随机产生的,那么所有可能的字符 char 都取自 s 中的某一个位置上的char
* 所以用nextInt(s.length())来产生一个范围在[0,s.length())的随机位置索引值
* 后面再使用charAt(index)方法就可获取随机的一个字符 这点很关键
*/
int randomCharIndex = random.nextInt(s.length());
sb.append(s.charAt(randomCharIndex));
}
//转换成String类型返回 因为泛型类是String
return sb.toString();
}
}
运行结果:
将要添加字符串:'6Hz3lWX6'
将要添加字符串:'jNsMP'
将要添加字符串:'jW'
将要添加字符串:'eRtc9g6Vf'
将要添加字符串:'j9GacY73'
将要添加字符串:'sCojn'
将要添加字符串:'y'
将要添加字符串:'jP'
将要添加字符串:'npf'
将要添加字符串:'gq'
-------------排序前---------------
元素:6Hz3lWX6
元素:jNsMP
元素:jW
元素:eRtc9g6Vf
元素:j9GacY73
元素:sCojn
元素:y
元素:jP
元素:npf
元素:gq
-------------排序后---------------
元素:6Hz3lWX6
元素:eRtc9g6Vf
元素:gq
元素:j9GacY73
元素:jNsMP
元素:jP
元素:jW
元素:npf
元素:sCojn
元素:y