l_yanlei
2016-02-22 00:12
package imooc_java_3_6_1To8; import java.util.Collections; import java.util.List; import java.util.Random; /** * 实现功能: * 1.创建List<String>,并且往其中添加10条随机字符串 * 2.每条字符串长度为10以内的随机整数 * 3.每条字符串的每个字符都为随机生成的字符,字符可以重复 * 4.每条随机字符串不可以重复 */ public class CollectionsTest { // 1.创建List<String>对象stringList,并且往其中添加10条随机字符串 List<String> stringList; public void testStringSort(){ //创建一个Random对象,用于生成随机数 Random random = new Random(); //定义一个字符串,存储所有可能出现的字符 String base = new String("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); //控制循环10次 for(int i = 0; i < 10; i++){ //得到一个10以内的随机整数,作为循环的次数,控制字符串的长度,数字可以重复 //循环得到一个随机字符(数字or字母【大写/小写】),把字符组合成一个字符串 int stringSize = random.nextInt(10); //定义一个StringBuffer对象,存储随机字符串(因为StringBuffer可以变换其内容,所以比较好) StringBuffer sb = new StringBuffer(); for(int j = 0; j < stringSize; j++){ //随机获得base字符串的一个字符的下标 int index = random.nextInt(base.length()); //把对应下标的字符添加到StringBuffer对象sb中 sb.append(base.charAt(index)); }//for循环结束,得到一条随机的字符串 //判断List中是否有该字符串,若无,则添加到list中,若有,则重新循环得到一个新的字符串 if(stringList.contains(sb)) continue; else{ //将StringBuffer类型转换成String类型并添加到List中 String randomString = sb.toString(); stringList.add(randomString); System.out.println("添加了字符串:" + randomString); } //10次循环结束,输出此时的stringList System.out.println("---------------添加前----------------"); for (String string : stringList) { System.out.println("元素:" + string); } //调用Collections.sort()方法对stringList排序,并输出排序后的stringList Collections.sort(stringList); System.out.println("---------------添加前----------------"); for (String string : stringList) { System.out.println("元素:" + string); } } } public static void main(String[] args) { CollectionsTest ct = new CollectionsTest(); ct.testStringSort(); } }
运行结果:
对应的异常代码(38行):
if(stringList.contains(sb)) continue;
我在这之前调试过,sb是有内容的,内容是一串随机的字符串。
然后我查看了一下contains的API,如下:
这里头也提到了空指针异常。
我怀疑会报错,是因为List对象stringList中没有内容,也就是满足后半句“此列表不允许null元素”。然而这里写着“可选”,我想知道这个“可选”是什么意思,可以让stringList在包含null元素的情况下,调用contains()方法不会报错?那要怎么实现呢?
另外,也想请教大家,API中说的,指定的元素是什么意思呢?是我传入做比较的这个元素,还是List中已有的元素呢?
刻苦专研,佩服!
传上一份改好的代码- -
package imooc_java_3_6_1To8; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; /** * 实现功能: * 1.创建List<String>,并且往其中添加10条随机字符串 * 2.每条字符串长度为10以内的随机整数 * 3.每条字符串的每个字符都为随机生成的字符,字符可以重复 * 4.每条随机字符串不可以重复 */ public class CollectionsTest { // 1.创建List<String>对象stringList,并且往其中添加10条随机字符串 List<String> stringList = new ArrayList<String>(); public void testStringSort(){ //创建一个Random对象,用于生成随机数 Random random = new Random(); //定义一个字符串,存储所有可能出现的字符 String base = new String("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); //控制循环10次 for(int i = 0; i < 10; i++){ //得到一个10以内的随机整数,作为循环的次数,控制字符串的长度,数字可以重复 //循环得到一个随机字符(数字or字母【大写/小写】),把字符组合成一个字符串 int stringSize; //保证字符串至少包含一个字符 do{ stringSize = random.nextInt(10); }while(stringSize <= 0); //定义一个StringBuffer对象,存储随机字符串(因为StringBuffer可以变换其内容,所以比较好) StringBuffer sb = new StringBuffer(); String randomString; for(int j = 0; j < stringSize; j++){ //随机获得base字符串的一个字符的下标 int index = random.nextInt(base.length()); //把对应下标的字符添加到StringBuffer对象sb中 sb.append(base.charAt(index)); }//for循环结束,得到一条随机的字符串 //判断List中是否有该字符串,若无,则添加到list中,若有,则重新循环得到一个新的字符串 /** * 以下注释部分会报空指针异常,估计是contains的原因。未知。 * 补充:开始的时候List<String> stringList ; * 并没有初始化 * 加上List<String> stringList = new ArrayList<String>();即解决问题; */ if(stringList.contains(sb)) continue; else{ //将StringBuffer类型转换成String类型并添加到List中 randomString = sb.toString(); stringList.add(randomString); System.out.println("添加了字符串:" + randomString); } } //10次循环结束,输出此时的stringList System.out.println("---------------排序前----------------"); for (String string : stringList) { System.out.println("元素:" + string); } //调用Collections.sort()方法对stringList排序,并输出排序后的stringList Collections.sort(stringList); System.out.println("---------------排序后----------------"); for (String string : stringList) { System.out.println("元素:" + string); } } public static void main(String[] args) { CollectionsTest ct = new CollectionsTest(); ct.testStringSort(); } }
好吧,我又对比了一下老师做对String类型的List排序的代码。发现在创建List<String> stringList时没有将它实例化为ArrayList<String>();加上这部分语句,也就是:
List<String> stringList = new ArrayList<String>();
代码就能正常运行了。傻了,忘记实例化对象了- -
不过关于contains的API中的空指针异常,还是求指教,不是很懂什么意思。
Java入门第三季
409767 学习 · 4530 问题
相似问题