2016-07-20 18 views
2

Ok, also weiß ich, dass Fragen WIE das hier sehr oft gefragt wurde, aber ich kann nicht scheinen, dass Lösungen funktionieren. Ich versuche, eine Zeichenfolge aus einer Datei zu nehmen und das längste Wort in dieser Zeichenfolge zu finden. Einfach.Das längste Wort in der Zeichenkette finden

Ich denke, die Frage ist, nach unten, ob ich meine Methoden einer anzurufenden auf string[] oder char[], derzeit stringOfWords gibt ein char[].

Ich versuche, dann durch absteigende Länge zu bestellen und den ersten Wert zu erhalten, aber bekomme eine ArgumentNullException über die OrderByDescending Methode.

Jeder Eingang sehr geschätzt.

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

-Code Sie‘ Als "Dies ist, wo ich versuche, das Problem zu lösen" gepostet, sieht nicht wie C# (wie alle. Net Eigenschaften/Methoden sind Großbuchstaben). Dieser Code sollte stattdessen kompilieren Fehler geben ... –

+0

Verwenden von var für alle Ihre Variablen-Deklarationen macht Ihren Code weniger lesbar. –

+0

@MrAnderson das ist eine Frage der Meinung. – stuartd

Antwort

3

ToArray() Methode in diesem Fall kehrt char[] die ein Array von einzelnen Zeichen bestehen. Stattdessen benötigen Sie eine Reihe einzelner Wörter. Sie können es wie folgt erhalten:

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

Und Sie haben einen Tippfehler in Ihrem Lambda-Ausdruck (Groß L):

n => n.Length 
+0

@ MartinHeralecký, danke, das war genau richtig. Das String-Array mit der Aufteilung nach Whitespace wurde erstellt. Und natürlich der Tippfehler dort! –

1

Wie in der anderen Antwort vorgeschlagen, müssen Sie Ihren String aufgeteilt werden.

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]; 

Was wir hier tun, die Zeichenfolge basiert Aufteilung auf Leerzeichen (‘‚) oder commas- Sie dort eine unbegrenzte Anzahl von Trennzeichen hinzufügen können - jedes Wort, dann bekommt seinen eigenen Platz in der Anordnung .

Von dort aus durchlaufen wir das Array. Wenn wir auf ein Wort stoßen, das länger ist als das aktuell längste Wort, aktualisieren wir es.

+0

Wie ist das nicht das längste Wort? – Ares

+0

Korrigiert erneut. – Ares

1

Try this:

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

Sie haben Recht! ich habe es repariert – Kedrzu

1

Sie die Zeichenfolge nicht geteilt, verwenden Sie einen Regex

Wenn Sie über die Leistung kümmern Sie nicht die Zeichenfolge aufgeteilt wollen. Der Grund, um die Split-Methode zu tun Querungs die gesamte Zeichenfolge haben, neue Saiten für die Elemente schaffen es findet aufzuspalten und steckte sie in ein Array, Rechenkosten von mehr als N, dann ein tun bestellen Sie eine andere (mindestens) O(nLog(n)) Schritte.

Sie können eine Regex für diese, die effizienter sein wird, denn es wird nur Iterierte über die Schnur einmal

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(); 
} 

Das Schöne daran ist, dass Sie brauchen nicht zu brechen die Zeichenfolge auf einmal, um die Analyse zu tun, und wenn Sie die Datei inkrementell laden müssen, ist eine ziemlich einfache Änderung, nur um das Wort in einem Objekt bestehen und rufen Sie es gegen mehrere Zeichenfolgen

Wenn Sie mit einem Array nicht durch Iterieren über

bestellen

Sie müssen einen Auftrag nicht tun, indem Ihr für die größte Position gerade auf der Suche, Rechenkomplexität der Ordnung in den meisten Fällen O(nLog(n)) durch ist, über die Liste iterieren hat eine Komplexität von O(n)

var largest = ""; 
foreach(var item in strArr) 
{ 
    if(item.Length>largest.Length) 
     largest = item; 
} 
Verwandte Themen