0

次のコードがあります。その意図は、配列の最小のアルファベット順のメンバーを返すことです。

public String smallest() {
String smallest = "";
int i = 0;
while(log[i] != null) {
    int nextIndex = i+1;
    if(log[nextIndex] == null) {
        break;
    }
    if(log[i].compareToIgnoreCase(log[nextIndex]) >0) {
        smallest = log[nextIndex];
    }
    else {
        smallest = log[i];
    }
    i++;
}
if(log[i].compareToIgnoreCase(smallest) <0) {
    smallest = log[i];
}
return smallest;
}

テスターを実行すると、2 つのテストが失敗し、他の 2 つのテストは正常に進行します。前者は成功したテストの例で、後者は失敗したテストの例です。

public void test_3Elements_smallest_in_middle() {
    strLog.insert("string 2"); strLog.insert("string 1");
    strLog.insert("string 3"); 

    assertEquals(strLog.smallest(), "string 1");
}

public void test_3Elements_smallest_at_beginning() {
    strLog.insert("string 1"); strLog.insert("string 2");
    strLog.insert("string 3"); 

    assertEquals(strLog.smallest(), "string 1");
}

これを修正するために一体何ができるでしょうか?より具体的には、後者の失敗したものについては、string[2] を期待していたが string[1] であったというエラーが表示されます。これは私を混乱させます。配列の中央で最小のものを選択できる場合、最初に最小のものを選択できないのはなぜですか?

4

3 に答える 3

1

このようなJavaが機能すると仮定します。私はそれをテストしませんでした。C# には同様の for 構文があります。インデックスを使用して実行できますが、これはよりクリーンです。

public String smallest() {
    String smallest = log[0]; //assumes atleast one element in list

    for (String message : log){
       if ( message != null && message.compareToIgnoreCase(smallest) < 0 ){
         smallest = message;
       }
    }

    return message;

    }

この時点であなたのコードで:

if(log[i].compareToIgnoreCase(log[nextIndex]) >0) {
    smallest = log[nextIndex];
}

リスト内のすべてのアイテムではなく、リスト内の連続する 2 つのアイテムのみを比較しています。これがあなたの答えが間違っている理由です。これは、リストがソートされていれば機能しますが、最初に最小のアイテムを取り出すのは簡単です。

于 2013-09-18T22:34:54.940 に答える