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入门第三季
409776 学习 · 4546 问题
相似问题