在java中排序字符串数组

时间:2013-06-26 11:35:12

标签: java sorting

我在ar1ar2中有两个字符串数组,我正在从文件中读取输入并存储在数组中,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]);}

  }

任何帮助都会很棒。谢谢!

5 个答案:

答案 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);