2016-07-20 16 views
2

これは私が解決策を働かせるようには思えません。 ファイルから文字列を取り出し、その文字列の中で最も長い単語を見つけようとしています。 シンプルズ。文字列中で最長の単語を見つける

私は、問題がダウンして私は現在stringOfWords戻りchar[]string[]またはchar[]の私のメソッドを呼び出していますかどうかだと思います。

長さを降順に並べ替えて最初の値を取得しようとしていますが、メソッドでArgumentNullExceptionが表示されています。

非常に感謝しています。この場合

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Runtime.CompilerServices; 
using System.Text; 
using System.Threading.Tasks; 

namespace TextExercises 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var fileText = File.ReadAllText(@"C:\Users\RichardsPC\Documents\TestText.txt"); 
      var stringOfWords = fileText.ToArray(); 

      Console.WriteLine("Text in file: " + fileText); 
      Console.WriteLine("Words in text: " + fileText.Split(' ').Length); 

      // This is where I am trying to solve the problem 
      var finalValue = stringOfWords.OrderByDescending(n => n.length).First(); 

      Console.WriteLine("Largest word is: " + finalValue); 
     } 
    } 
} 
+0

コードあなたの複雑さを持っています"これは私が問題を解決しようとしているところです"とC#のようには見えません(すべての.Netプロパティ/メソッドは大文字です)。そのコードは、代わりにエラーをコンパイルする必要があります。 –

+0

すべての変数宣言にvarを使用すると、コードが読みにくくなります。 –

+0

@MrAndersonそれは意見の問題です。 – stuartd

答えて

3

方法ToArray()は、個々の文字の配列であるchar[]を返します。しかし、代わりに個々の単語の配列が必要です。あなたはこのようにそれを得ることができます。

string[] stringOfWords = fileText.Split(' '); 

そして、あなたは(大文字のL)あなたのラムダ式にタイプミスがあります

n => n.Length 
+0

@MartinHeralecký、ありがとう、それにスポットがあった。空白に分割して文字列配列を作成すると、ソートされました。もちろん、そこにタイプミスがあります! –

1

他の回答で示唆したように、あなたはあなたの文字列を分割する必要があります。

string[] stringOfWords = fileText.split(new Char [] {',' , ' ' }); 
//all is well, now let's loop over it and see which is the biggest 
int biggest = 0; 
int biggestIndex = 0; 

for(int i=0; i<stringOfWords.length; i++) { 
    if(biggest < stringOfWords[i].length) { 
     biggest = stringOfWords[i].length; 
     biggestIndex = i; 
    } 
} 
return stringOfWords[i]; 

私たちが空白(」「)、またはあなたがそこに区切り文字の数に制限を追加することができますcommas-に基づいて文字列を分割され、ここでやっている - 各単語を、そして、アレイ内で独自のスペースを取得します。

そこから、配列を反復処理しています。現在の最長単語よりも長い単語が出現した場合は、それを更新します。

+0

これは一番長い言葉ではありませんか? – Ares

+0

もう一度修正しました。 – Ares

1

はこれを試してみてください:

var fileText = File.ReadAllText(@"C:\Users\RichardsPC\Documents\TestText.txt"); 
var words = fileText.Split(' ') 
var finalValue = fileText.OrderByDescending(n=> n.Length).First(); 
Console.WriteLine("Longest word: " + finalValue"); 
+0

あなたは正しいです!それを私が直した – Kedrzu

1

文字列を分割しないでください、あなたは文字列を分割したくないパフォーマンスを気にしている場合、正規表現に

を使用しています。 splitメソッドを実行するために、その理由は、それを分割し、が、その後やって、配列、以上Nの計算コストにそれらを置くためにを見つけたアイテムを含む新しい文字列を作成し、文字列全体トラバースを持っています他の(少なくとも)O(nLog(n))ステップを実行してください。

あなたは、より効率的になり、このための正規表現を使用することができますのでれる文字列の上にだけ反復一度

var regex = new Regex(@"(\w+)\s",RegexOptions.Compiled); 
var match = regex.Match(fileText); 
var currentLargestString = ""; 

while(match.Success) 
{ 
    if(match.Groups[1].Value.Length>currentLargestString.Length) 
    { 
     currentLargestString = match.Groups[1].Value; 
    } 

    match = match.NextMatch(); 
} 

これについての素晴らしい事は、あなたが分割する必要がないということです解析を行うために一度に文字列を上げてください。ファイルを徐々に読み込む必要がある場合は、オブジェクトに単語を残して複数の文字列に対して呼び出すだけです。

配列は、繰り返し処理することで順序付けしません。

あなたのだけの最大のアイテムを探すことによって、順序をする必要はありません

、オーダーの計算の複雑さにより、ほとんどの場合O(nLog(n))で、リストを反復処理すると、「O(n)

var largest = ""; 
foreach(var item in strArr) 
{ 
    if(item.Length>largest.Length) 
     largest = item; 
} 
関連する問題