0

文字列の配列をアルファベット順に整理する必要があります。理論的には、各単語の最初の文字は大文字になります (ただし、ユーザーを常に信頼できるとは限らないため、必ずしもそうとは限りません)。試してみArrays.sort()ましたが、プログラムを実行できません。を使用してみcompareTo()ましたが、プログラムの実行中にコードのそのセクションに到達すると、次のエラーが発生します。

Exception in thread "main" java.lang.NullPointerException
        at java.lang.String.compareTo(Unknown Source)
    at NameandAge.printNameOrder(NameandAge.java:431)
    at NameandAge.print(NameandAge.java:350)
    at NameandAge.main(NameandAge.java:116)

文字通り、この件に関して私が見つけることができるものはすべて、これら 2 つの解決策のいずれかを提供してくれます。他の提案はありますか?

(記録のために、コードは現在読み取ります: )

while(!done)
{
    done=true;   
    for(int i=0;i<organizedNames.length-1;i++)
    {
        if(!(organizednames[i]==null))
        {
            String name1=organizedNames[i]; String name2=organizedNames[i+1];
            if(name1!=null&&name2!=null)
            {
                int num=name1.compareTo(name2);
                if(num>0)
                { 
                    temp=organizedNames[i]; //temp is a String that was declared earlier
                    organizedNames[i]=organizedNames[i+1];
                    organizedNames[i+1]=temp;
                    done=false 
                }
            }
        }
    }
}

編集: name1 と name2 ではないことを確認するためにチェックを試みましたnull。これで動作しますが、出力は次のとおりです。 Joe
Bill
Bob
Smith
Rodney
James
Philip
Lillian
Charlie
Angel
Carol
Noah
今、コードのセクション全体を追加しました (もちろん、while ループを除いて)。これは基本的に私が見つけた正確な解決策であり、出力を提供する最初の解決策です。私は何を間違っていますか?

編集 (再度): これは、並べ替えを呼び出すコードです。

String[]organizedNames=new String[names.length];
organizedNames=sortNames(organizedNames);

そして、ソート自体のコードは、基本的に以下の回答にあるものです。

4

5 に答える 5

1

バブル ソート アルゴリズムのバリエーションを実行していて、null 文字列の入力配列をサニタイズしていないと仮定すると、問題はorganizedNames[i]null である可能性があります。

この場合、null アイテムを削除するか、配列の最後にリストするかを決定する必要があります。後者が真である場合、比較を行う前に、そうであるかどうname1 == null || name2 == nullかを確認し、num を -1 に設定します。これにより、配列内のすべての null 項目が 1 つの場所に配置されます。

二次的な質問に答えるには、次のことを試してください。

boolean done = false;
while(done == false){
  done = true;
  for(int i=0;i<organizedNames.length-1;i++)
  {
    int num = 0;
    if(organizedNames[i] != null && organizedNames[i + 1] != null)
    {
        String name1=organizedNames[i]; String name2=organizedNames[i+1];
        num=name1.compareTo(name2);
    }
    else if(organizedNames[i] == null && organizedNames[i + 1] == null){
      num = 0;
    }
    else if(organizedNames[i] == null){
      num = 1;
    }
    else {
      num = -1;
    }
    if(num>0)
    {
        String temp=organizedNames[i];
        organizedNames[i]=organizedNames[i+1];
        organizedNames[i+1]=temp;
        done=false;
    }
  }
}
于 2013-09-08T23:33:22.073 に答える
0

ここであなたは正しい混乱に陥りました!あなたがやろうとしてきたことは、元のバージョンが機能しなかった理由を理解せずに、独自のソート アルゴリズムをゼロから実装することです。うまくいきませんでした...元のバージョンがうまくいかなかったのと同じ理由です。

証拠を正しく読んでいれば、問題の根本原因nullは入力配列の値です。これに対処するには、次の 3 つの簡単な方法があります。

  1. nullnull を削除した新しい (より小さい) 配列を作成して、値を取り除きます。

  2. 値を、NPE を発生させずに安全に比較できるnull何らかの値 (たとえば、空の) に置き換えます。String

  3. Comparatorsを許容する a を実装しnullます。たとえば、null 以外の文字列の後に並べ替えたい場合はnull...

      public class MyComparator implements Comparator<String> {
          public int compare(String s1, String s2) {
              if (s1 == null) {
                  return (s2 == null) ? 0 : +1;
              } else {
                  return (s2 == null) ? -1 : s1.compareTo(s2);
              }
          }
      }
    
      String[] array = ...
      Arrays.sort(array, new MyComparator());
    

質問のコードが正しくソートされない理由に興味がある場合は、null. 基本的に、コード (書かれているとおり) は配列エントリの連続するペアを比較し、順序が間違っている場合はそれらを交換します。スワップするものが見つからない配列を通過すると、停止します。問題は、比較している要素のいずれかが である場合、nullそれらを比較しないことです。したがってnull、配列に がある場合、 の前の nullnull以外の要素は、 の後の null 以外の要素と比較できませんnull

于 2013-09-09T02:31:34.710 に答える
0

Array.Sort()定義済みおよびメソッドを使用しないこのコードを使用しますcompareTo()

sortStringArray(new String[]{"Henry Bernard",
            "Cherish Davidson",
            "Joshua Norris",
            "Eleanor Kelley",
            "Jaslyn Schneider",
            "Holly Herman",
            "Willie Strong",
            "Eliana Villa",
            "Lennon Odom",
            "Monica Velasquez",
            "Salvatore Levy",
            "Taliyah Bruce"});

public static void sortStringArray(String[] array) {
    for (int i = 0; i <= array.length - 1; i++) {
        for (int j = 1; j < array.length - i; j++) { //Apply the bubble Sort
            if (CompareString(array[j - 1], array[j]) == 1) { //Pass the two adjacent string for comparing
                String temp = array[j - 1];
                array[j - 1] = array[j];
                array[j] = temp;
            }
        }
    }

    for (int i = 0; i <= array.length - 1; i++) {
        System.out.println(array[i]);
    }
}

private static int CompareString(String first, String second) {
    int len;

    if (first.length() >= second.length()) //we need to take the smallest string length
        len = second.length();
    else
        len = first.length();

    for (int i = 0; i <= len; i++) {
        if (first.charAt(i) > second.charAt(i))  //Suppose the first string letters is greater then return 1; 
            return 1;
        else if (first.charAt(i) < second.charAt(i)) //if second string letter is greater then return -1;
            return -1;
    }
    return 0;  //if both the equal then return 0
}
于 2018-09-15T18:31:43.413 に答える