找到字符串中最长的单词

时间:2016-07-20 22:51:00

标签: c#

好的,所以我知道像这样的问题已经在这里被问了很多,但我似乎无法使解决方案有效。 我试图从文件中取一个字符串,找到该字符串中最长的单词。 Simples。

我认为问题在于我是在string[]还是char[]调用我的方法,目前stringOfWords会返回char[]

我尝试按降序排序并获得第一个值,但我在ArgumentNullException方法上获得OrderByDescending

任何输入都非常赞赏。

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

4 个答案:

答案 0 :(得分:3)

在这种情况下,方法ToArray()返回char[],这是一个单独字符的数组。但相反,你需要一系列单词。你可以这样得到它:

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

你的lambda表达式中有一个拼写错误(大写L):

n => n.Length

答案 1 :(得分:2)

试试这个:

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");

答案 2 :(得分:2)

不要拆分字符串,使用正则表达式

如果你关心性能,你不想拆分字符串。为了执行拆分方法,必须遍历整个字符串为找到的项创建新字符串进行拆分,将它们放入数组中,计算成本超过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();
}

关于这一点的好处是你不需要一次性破坏字符串来进行分析,如果你需要以递增的方式加载文件,那么只需要在对象中保留单词就可以了。将其称为多个字符串

如果您已开始使用数组,请不要通过迭代

进行排序

您只需要查找最大的项目就不需要执行订单,大多数情况下{order for}的计算复杂度,迭代列表的复杂度为O(nLog(n)) < / p>

O(n)

答案 3 :(得分: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];

我们在这里做的是根据空格(&#39;&#39;)或逗号分割字符串 - 你可以在那里添加无限数量的分隔符 - 然后,每个单词都有自己的分隔符数组中的空间。

从那里,我们重复遍历数组。如果我们遇到一个比当前最长的单词更长的单词,我们会更新它。