我在ar1
和ar2
中有两个字符串数组,我正在从文件中读取输入并存储在数组中,ar1
包含
Cat
Lam
Orange
Kam
Ramveer
None
Tue
Apple
ar2包含
Dog
elephant
Kam
Monday
Parrot
Queen
Ramveer
Tuesday
Xmas
我正在尝试按字母顺序对数组进行排序,我正在使用Array.sort()
,但是获得异常
Exception in thread "main" java.lang.NullPointerException
at java.util.ComparableTimSort.binarySort(ComparableTimSort.java:232)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:176)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at CompareArrays.pr1(CompareArrays.java:51)
at CompareArrays.main(CompareArrays.java:86)
Java结果:1 建立成功(总时间:0秒)
代码
File file1= new File("C:\\Users\\Ramveer\\Desktop\\updates\\f1.txt");
File file2=new File("C:\\Users\\Ramveer\\Desktop\\updates\\f2.txt");
Scanner sc1=new Scanner(file1);
Scanner sc2=new Scanner(file2);
while(sc1.hasNextLine()){
ar1[c1]=sc1.nextLine();
c1++;
}
while(sc2.hasNextLine()){
ar2[c2]=sc2.nextLine();
c2++;
}
Arrays.sort(ar1);
for(int k=0;k<c1;k++){
System.out.println(ar1[k]);}
}
任何帮助都会很棒。谢谢!
答案 0 :(得分:8)
由于您使用的是数组,因此必须提前预测条目数。看起来您的预测已关闭,因此某些数组元素保持null
。
请考虑使用ArrayList
而不是原始数组。使用Collections.sort
进行排序。
答案 1 :(得分:1)
如果您的数组对于数据而言太大,则未使用的元素中的默认值为null
;这些null
值会导致您的异常。
在加载和排序数组之前,将空白放在所有元素中:
Arrays.fill(a1, "");
Arrays.fill(a2, "");
答案 2 :(得分:0)
使用Arraylist然后你不必估计数组的大小,因为随着你添加更多字符串,ArrayList会动态增长,你的代码将会是这样的
File file1= new File("C:\\Users\\Ramveer\\Desktop\\updates\\f1.txt");
File file2=new File("C:\\Users\\Ramveer\\Desktop\\updates\\f2.txt");
Scanner sc1=new Scanner(file1);
Scanner sc2=new Scanner(file2);
List<String> list1 = new ArrayList<String>()
List<String> list2 = new ArrayList<String>()
while(sc1.hasNextLine())
list1.add(sc1.nextLine().toLowerCase()); //edited -- bad approach but would work if case not important
while(sc2.hasNextLine()){
list2.add(sc2.nextLine().toLowerCase()); //edited -- bad approach but would work if case not important
Collections.sort(list1);
Collections.sort(list2);
for(String s: list1)
System.out.println(s);
或者你可以这样做来实现一个不区分大小写的排序,这会比你在添加到数组时更改字符串更好
Collections.sort(list1, new Comparator<Object>()
{
@Override
public int compare(Object o1, Object o2)
{
String s1 = (String) o1;
String s2 = (String) o2;
return s1.compareToIgnoreCase(s2);
}
}
然后重复list2。但更好的方法是编写一个新的比较器方法
public class SortIgnoreCase implements Comparator<Object> {
public int compare(Object o1, Object o2) {
String s1 = (String) o1;
String s2 = (String) o2;
return s1.compareToIgnoreCase(s2);
}
}
然后调用Collections.sort(list1, new SortIgnoreCase());
这是一种更简洁的方式来编写代码来排序多个列表
答案 3 :(得分:0)
如果您真的想使用数组,请使用它来阅读:
List<String> list1 = new ArrayList();
while (sc1.hasNextLine()) {
list1.add(sc1.nextLine());
}
String[] ar1 = list1.toArray(new String[list1.size()]);
如果您可以使用List集合,那么:
List<String> list1 = new ArrayList();
while (sc1.hasNextLine()) {
list1.add(sc1.nextLine());
}
Collections.sort(list1);
答案 4 :(得分:0)
如果您的数组没有空值Arrays.sort()
正常工作。
因此,最好使用List
来避免这种情况。
然后,您可以将数组转换为ArrayList
并使用Collections.sort()
对其进行排序。
String[] str1 = {"Cat","Lam","Orange","Kam","Ramveer","None","Tue","Apple"};
String[] str2 = {"Dog","Elephant","Kam","Monday","Parrot","Queen","Ramveer","Tuesday","Xmas"};
List<String> lst1=Arrays.asList(str1);
List<String> lst2=Arrays.asList(str2);
Collections.sort(lst1);
Collections.sort(lst2);
System.out.println(lst1+"\n"+lst2);