【问题标题】:Need help in Hashtable implementation在 Hashtable 实现方面需要帮助
【发布时间】:2010-04-06 19:54:42
【问题描述】:

我是 C# 的初学者,我试图编写一个从输入的字符串中提取单词的程序,用户必须输入单词的最小长度来过滤输出的单词......我的代码没有看起来不错或直观,我使用了两个数组countStr 来存储单词,countArr 存储对应于每个单词的单词长度.. 但问题是我需要使用哈希表而不是这两个数组,因为它们的大小都是根据用户输入的字符串长度,我认为这对内存或其他东西不太安全?

这是我的简陋代码,我再次尝试用一个哈希表替换这两个数组,如何做到这一点?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication2
{
class Program
{

    static void Main(string[] args)
    {
        int i = 0 ;
        int j = 0;
        string myString = "";
        int counter = 0;
        int detCounter = 0;          

        myString = Console.ReadLine();
        string[] countStr = new string[myString.Length];
        int[] countArr = new int[myString.Length];

        Console.Write("Enter minimum word length:");
        detCounter = int.Parse(Console.ReadLine());

        for (i = 0; i < myString.Length; i++)
        {
            if (myString[i] != ' ')
            {
                counter++;
                countStr[j] += myString[i];
            }
            else
            {
                countArr[j] = counter;
                counter = 0;
                j++;
            }                                               
        }

        if (i == myString.Length)
        {
            countArr[j] = counter;
        }

        for (i = 0; i < myString.Length ; i++)
        {
           if (detCounter <= countArr[i])
            {
                Console.WriteLine(countStr[i]);
            }   
        }

     Console.ReadLine();     

    }        
  }
 } 

【问题讨论】:

    标签: c# string hashtable


    【解决方案1】:

    你的第一次尝试并没有太糟糕,但这可能会好很多。

    第一件事:在解析人类输入的整数时使用 TryParse 而不是 Parse。如果人类键入“HELLO”而不是整数,如果使用 Parse,程序将崩溃;仅当您知道它是整数时才使用 Parse。

    接下来:考虑使用String.Split将字符串拆分成单词数组,然后处理单词数组。

    接下来:像你这样有大量数组突变的代码很难阅读和理解。考虑将您的问题描述为一个查询。你想问什么?我不确定我是否完全理解您的代码,但在我看来,您好像在说“取这个用空格分隔的字符串。取最小长度。给我那个字符串中超过最小值的所有单词长度。”是吗?

    在这种情况下,编写如下代码:

    string sentence = whatever;
    int minimum = whatever;
    var words = sentence.Split(' ');
    var longWords = from word in words 
                    where word.Length >= minimum 
                    select word;
    foreach(var longWord in longWords) 
        Console.WriteLine(longWord);
    

    然后就可以了。注意代码读起来就像它在做什么。尝试编写代码,使代码传达代码的含义,而不是代码的机制

    【讨论】:

    • 感谢您提供的信息丰富的答案,但我有一个问题,为什么您在减速时经常使用 var 而不是 string 和 string[] ?
    • @rafael:好问题。一个完整的答案会很长,但简单地说,我的原因是使用 var 进一步强调了代码的 含义 而不是 机制。什么是词?谁在乎?它是一个单词的集合,这就是你为了这个算法的目的而需要担心的全部。什么是长词?谁在乎?这是过滤“单词”的结果,这就是您需要担心的全部。它是 string[] 还是 List 还是 IEnumerable 还是 IList 或其他东西有关系吗?不。重要的是它的含义,而不是它的存储细节。
    【解决方案2】:

    一个字。字典(或哈希表)。两者都是您可以使用的标准数据类型

    【讨论】:

      【解决方案3】:

      为此使用字典(在您的情况下,您正在寻找字典)。

      您提取的字符串将是键,它的长度是值。

      Dictionary<string, int> words = new Dictionary<string,int>();
      //algorithm
      words.Add(word, length);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 2014-02-06
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多