0

と に 2 つの文字列配列が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 Result: 1 BUILD SUCCESSFUL (合計時間: 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]);}

  }

どんな助けでも素晴らしいでしょう。ありがとう!

4

5 に答える 5

8

配列を使用しているため、事前にエントリ数を予測する必要があります。あなたの予測は外れているようですので、一部の配列要素は残りnullます。

ArrayList生の配列の代わりに使用することを検討してください。並べ替えは で行いCollections.sortます。

于 2013-06-26T11:37:52.143 に答える
1

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());次に、複数のリストをソートするコードを書くためのよりクリーンな方法であるを呼び出し ます

于 2013-06-26T11:43:06.270 に答える
1

配列がデータに対して大きすぎる場合null、未使用の要素にデフォルト値があります。これらのnull値は例外を引き起こします。

配列を読み込んで並べ替える前に、すべての要素に空白を入れてください。

Arrays.fill(a1, "");
Arrays.fill(a2, "");
于 2013-06-26T11:43:36.870 に答える
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);
于 2013-06-26T11:44:18.127 に答える
0

配列に null 値がない場合、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);
于 2013-06-26T12:10:25.517 に答える