2010-04-06 8 views
2

저는 C#에서 초보자입니다. 입력 한 문자열에서 단어를 추출하는 프로그램을 작성하려고했는데 단어 길이를 입력하여 단어 출력을 필터링하는 최소 길이를 입력해야했습니다 ... 내 코드가 잘 보이지 않거나 직관적이지 않다. 두 개의 배열을 사용하여 countStr 단어를 저장할 때 각 단어에 대응하는 단어 길이를 저장한다. 그러나 문제는 두 개의 배열 대신 해시 테이블을 사용해야한다. 사용자가 입력 한 문자열 길이에 따라 다르다. 메모리 나 다른 무언가에 대해 너무 안전하지 않다고 생각 하는가?Hashtable 구현에서 도움이 필요하십니까

여기 내 겸손 코드, 다시 한 해시 테이블로 두 배열을 대체하려고하는데, 어떻게 할 수 있습니까?

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

    }   
    } 
} 

답변

12

첫 시도에서 너무 나쁘지는 않지만 훨씬 더 좋을 수 있습니다.

첫 번째 사항 : 사람이 정수 입력을 구문 분석 할 때 Parse가 아닌 TryParse를 사용하십시오. 인간이 정수 대신 "HELLO"를 입력하면 구문 분석을 사용하면 프로그램이 중단됩니다. 이 정수인 경우을 알고있을 때만 구문 분석을 사용하십시오.

다음 작업 : 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); 

을 그리고 거기 당신은 간다. 코드가 어떻게 진행되는지를 주목하십시오. 코드가 의미 코드의 의미가 아닌 코드를 전달하도록 코드를 작성하십시오.

+1

감사합니다.하지만 질문이 있으십니까? 왜 감속에서 문자열과 문자열 대신 [var]을 자주 사용합니까? – rafael

+10

@rafael : 좋은 질문입니다. 완전한 대답은 꽤 길지만 간단히 말해서, 내 이유는 var를 사용하면 * 메커니즘 *에 대한 코드의 의미 *를 더욱 강조한다는 것입니다. 말은 무엇인가? 누가 신경 쓰겠 니? 단어 모음이므로이 알고리즘의 목적에 대해 걱정할 필요가 있습니다. longWords 무엇입니까? 누가 신경 쓰겠 니? 그것은 "단어"를 필터링 한 결과이며 걱정해야 할 것이 전부입니다. 문자열 []이든 목록 이든 IEnumerable 이든 IList 이든 다른 것일까 요? 아닙니다. 중요한 것은 스토리지의 의미가 아니라 의미입니다. –

0

한 단어. Dictioary (또는 HashTable). 둘 다 사용할 수있는 표준 데이터 유형입니다

0

사전을 사용하십시오 (귀하의 경우 사전을 찾고 있습니다).

추출한 문자열이 키가되며 길이는 값이됩니다.

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