-2

こんにちは、少し行き詰まっています。文字列内で 3 番目に長い単語を見つける方法がわかりません。コードで最長を見つけることができましたが、3 番目に長い単語を見つけることができません。助けはありますか?

public void longestWord()
    {
        string sentance, word;
        word = " ";
        char[] a = new char[] { ' ' };
        sentance = textBox1.Text;  //<--string here


        foreach (string s1 in sentance.Split(a))
        {
            if (word.Length < s1.Length)
            {
                word = s1;
            }
        }
        label9.Text = ("The longest word is " + word + " and its length is " + word.Length + " characters long");
    }

PS文字列imテストの例は次のとおりです。

    1.

DarkN3ss は、Windows ベースのビジネス ソリューションで最も経験豊富なプロバイダーです。私は、このテクノロジーと方向性を可能な限り理解した上で、自分のビジネス価値を提供することに集中しています。DarkN3ss は、Windows および Linux 製品に関する私の能力と経験に基づいてソリューションを実装するための「エリート ビジネス パートナー」として私を認めました。

4

6 に答える 6

2

linqを使ってみてはどうですか?

sentance.Split(' ').OrderByDescending(w => w.Length).Skip(2).FirstOrDefault()

関数内:

public void nthLongestWord(int index = 0)
{
    string word = null;
    if(index <= 0)
    {
        word = sentance.Split(' ').OrderByDescending(w => w.Length).FirstOrDefault();
    }
    else
    {
        word = sentance.Split(' ').OrderByDescending(w => w.Length).Skip(index - 1).FirstOrDefault();
    }


    if(!string.IsNullOrWhitespace(word))
    {
        label9.Text = ("The longest word is " + word + " and its length is " + word.Length + " characters long");
    }
    else 
    {
        // display something else?
    }
}
于 2012-11-21T02:14:08.947 に答える
1

現在のコードに最小限の変更を加えたい場合は、最も長い 3 つの単語を格納する必要があります (つまり、word、 have word1word2、およびword3、または必要に応じて配列の代わりに)。

次に、if ステートメントで、word3=word2、word2=word1、および word1=s1 を設定します。

そうすれば、3 番目に大きい単語は になりword3ます。

最も効率的ではありませんが、現在のコードをある程度維持することができます。

于 2012-11-21T02:11:31.547 に答える
1

解決策: 3 番目に大きい単語をすべて取得するには

   string[] splitStr = sentence.Split(' ');

   if (splitStr.Length > 2)
   {
        List<int> allLengths = splitStr.Select(x => x.Length).Distinct().ToList();

        int thirdLargestWordLength = allLengths.OrderByDescending(x => x)
                                               .Skip(2).Distinct().Take(1).FirstOrDefault();

        if (splitStr[0].Length != thirdLargestWordLength && 
         splitStr[1].Length != thirdLargestWordLength)
         {

            string[] theThirdLargestWords = splitStr.Where(x => x.Length == thirdLargestWordLength)
                                                                  .ToArray();


             if (theThirdLargestWords.Length == 1)
             {
                label9.Text = "The third longest word is " + theThirdLargestWords[0];
             }
             else
             {
                string words = "";

                for (int i = 0; i < theThirdLargestWords.Length; i++)
                {
                   if (i == 0)
                   {
                     words = theThirdLargestWords[i];
                }
               //else if ((i + 1) == theThirdLargestWords.Length)
               //{
               //   words += " and " + theThirdLargestWords[i];
               //}
                else
                {
                    words += ", " + theThirdLargestWords[i];
                }
             }

             label9.Text = "The third longest words are " + words;
        }
      }
   }

文字列にそれが必要かどうかわからないので、「and」の部分をコメントアウトしました。最初の if ステートメントも追加したので、単語が 3 つ未満の場合でもエラーが発生しません。

于 2012-11-21T02:29:10.733 に答える
0

これはコンパイルエラーがあるかもしれませんが、あなたにアイデアを与えるためだけです。

var words = statement.split();

words.OrderBy(w => w.length).ToArray()[2]

于 2012-11-21T02:17:49.190 に答える
0

GroupByの長さのソリューション

var thirdLongests = words.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).GroupBy(x => x.Length).OrderByDescending(x => x.Key).Skip(2).First().ToArray();
于 2012-11-21T02:54:48.677 に答える
0

一時的な配列を使用することに慣れている場合は、そこに単語をコピーし、並べ替えて、3 番目に長いものを取得する必要があります。

于 2012-11-21T02:08:59.743 に答える