0

以下のコードは、私のクイック選択 (ソートされた配列全体ではなく、ソートされた配列の n 番目の項目を返すことを除いて、クイックソートに非常に似ています) メソッドです。入力は文字列 (単語) の配列であり、指定された単語が並べ替えられている場合、n 番目のインデックスの単語を返す必要があります。

    static string QuickSelect(string[] lst, int index) {
        if (lst.Length == 1)
        {
            Console.Write(lst[0]);
            return lst[0];
        }

        else
        {
            int pivot = _r.Next(lst.Length); // pick a pivot by random number generator
            bool[] isDecre = new bool[lst.Length];
            string[] WordLeft, WordRight;
            int nLeft = 0, nRight = 0;

            for (int i = 0; i < lst.Length; i++) // compare values to pivot
            {
                if (i == pivot) continue;
                if (WordCompare(lst[pivot], lst[i]))
                {
                    nRight++;
                    isDecre[i] = false;
                }
                else
                {
                    nLeft++;
                    isDecre[i] = true;
                }
            }


            if (nLeft == index) // pivot was the (index)th item in the list
                return lst[pivot];

            else
            {

                WordLeft = new string[nLeft];
                WordRight = new string[nRight];
                int l = 0, r = 0;
                // divide list by saved comparison result
                for (int i = 0; i < lst.Length; i++)
                {
                    if (i == pivot) continue;
                    if (isDecre[i])
                    {
                        WordLeft[l] = lst[i];
                        l++;
                    }
                    else
                    {
                        WordRight[r] = lst[i];
                        r++;
                    }
                }

                if (nLeft > index)
                    return QuickSelect(WordLeft, index);
                else if (nLeft < index)
                    return QuickSelect(WordRight, index - nLeft - 1);
            }
        }
    }

問題は、このコードが実行されず、「すべてのコード パスが値を返すわけではない」というエラーがスローされることです。私はそれがこの部分に関係していると思います:

if (nLeft == index) // pivot was the (index)th item in the list
    return lst[pivot];
// build left and right word lists
 ...
if (nLeft > index)
    return QuickSelect(WordLeft, index);
else if (nLeft < index)
    return QuickSelect(WordRight, index - nLeft - 1);

上記の「else if」の後に「else」を置くと、エラーはなくなります。しかし、ピボットが n 番目のインデックス文字列である場合、左右の単語リストを作成したくありません。実際、この値を返さないパスが検出されるのはナンセンスだと思います。回避策はありますか?

4

3 に答える 3

2

いいえ、回避策はありません。

メソッド内のすべてのパスで値を返す、例外 (そのメソッドでは処理されません) をスローする必要があります。

編集:

一方、あなたの条件:

if (nLeft == index) // pivot was the (index)th item in the list
    return lst[pivot];
// build left and right word lists
 ...
if (nLeft > index)
    return QuickSelect(WordLeft, index);
else if (nLeft < index)
    return QuickSelect(WordRight, index - nLeft - 1);

これに変更できます:

if (nLeft == index) // pivot was the (index)th item in the list
    return lst[pivot];
// build left and right word lists
 ...
if (nLeft > index)
    return QuickSelect(WordLeft, index);
return QuickSelect(WordRight, index - nLeft - 1);
于 2012-12-23T20:04:54.863 に答える
0


if (nLeft > index)
return QuickSelect(WordLeft, index);
else if (nLeft < index)
return QuickSelect(WordRight, index - nLeft - 1);
else //nLeft== index
return "something";

両方の条件が失敗した場合でも、uは何らかの値を返す必要があり、戻り値に基づいてそのケースをさらに処理できます。

于 2012-12-23T20:11:45.057 に答える
0

コードは、指定された条件が true の場合にのみ値を返します。3 つの条件を指定したため、メソッドはこれらの条件のいずれかが true になった場合にのみ値を返しますが、この場合、3 つの条件が両方とも false になった場合にアプリケーションが何をすべきかわからないため、エラーが発生します。これらの条件が false になったときに何が行われるかを指定していないため、返す値はありません。そのため、bool がtrueまたはになる可能性があるため、エラーが発生します。false

if (nLeft == index) //Continue if the condition becomes true
    return lst[pivot]; //Return a value
 ...
if (nLeft > index) //Continue if the condition becomes true
    return QuickSelect(WordLeft, index); //Return a value
else if (nLeft < index) //Continue if the condition becomes true
    return QuickSelect(WordRight, index - nLeft - 1); //Return a value

これらの条件が false になった場合にアプリケーションに別の値を返すように単純に指示する行をこのメソッドに追加する必要があります ( の別の可能性bool) 。

if (nLeft == index) //Continue if the condition becomes true
    return lst[pivot]; //Return a value
 ...
if (nLeft > index) //Continue if the condition becomes true
    return QuickSelect(WordLeft, index); //Return a value
else if (nLeft < index) //Continue if the condition becomes true
    return QuickSelect(WordRight, index - nLeft - 1); //Return a value
else //Continue if these conditions become false
    return /* value */; //Return a value

ありがとう、
これがお役に立てば幸いです:)

于 2012-12-23T20:19:59.243 に答える