2013-11-16 4 views
0

Начну с того, что я не совсем обернулся вокруг ООП.Добавление и подсчет каждого слова в строке в связанном списке

Мне нужна процедура, которая выполняет итерацию через каждое слово в строке, проверяет, находится ли она в моем связанном списке и добавляет ее как узел, если она не является или увеличивает счет существующего узла, если он находится в список.

Вот что у меня есть:

private void CountWords(string cleanString) 
     { 
      WordNode nextNode, prevNode; 
      WordNode addNode; 
      foreach (string stringWord in cleanString.Split(' ')) 
      { 
       if (head == null) 
       { 
        // No items in list, add to the beginning 
        addNode = new WordNode(stringWord); 
        head = addNode; 
       } 
       else 
       { 
        if (String.Compare(stringWord, head.Word) < 0) 
        { 
         // If stringWord belongs at the beginning of the list, put it there 
         addNode = new WordNode(stringWord); 
         addNode.NextWord = head; 
         head = addNode; 
        } 
        else if (String.Compare(stringWord, head.Word) == 0) 
        { 
         // If stringWord is equal to head.Word, increase count 
         addNode.Count += 1; 
        } 
        else 
        { 
         prevNode = head; 
         nextNode = head.NextWord; 
         // If it doesn't belong at the beginning, cycle through the list until you find where it does belong 
         while ((nextNode != null) && (String.Compare(nextNode.Word, addNode.Word) < 0)) 
         { 
          prevNode = nextNode; 
          nextNode = nextNode.NextWord; 
         } 
         if (nextNode == null) 
         { 
          prevNode.NextWord = addNode; 
         } 
         else 
         { 
          prevNode.NextWord = addNode; 
          addNode.NextWord = nextNode; 
         } 
        } 

       } 
      } 
     } 

До этого я пытать AddNode = новый WordNode (stringWord); в начале каждой итерации через цикл «для каждого слова в строке», но это будет определять класс и сбросить счет до 1. Теперь, в настоящее время, я не могу увеличить счет, потому что addNode.Count + = 1; не определено. Я надеялся, что смогу проверить, был ли stringWord в связанном списке, и если да, добавьте stringWord.count к одному, но это вызывает ошибку.

Глядя на это сейчас, я думаю addNode.Count + = 1; принадлежит в цикле в то время как несколько строк ниже его ...

Вот мой WordNode класс:

class WordNode 
    { 
     // constants 

     // variables 
     private string data;   // this is our only data, so also key 
     private int count; 
     private WordNode next;   // this is reference to next Node 

     // constructors 
     public WordNode(string newValue) 
     { 
      Word = newValue; 
      count = 1; 
      NextWord = null; 
     } 

     // methods 
     public string Word 
     { 
      get 
      { 
       return data; 
      } 
      set 
      { 
       data = value; 
      } 
     } 

     public int Count 
     { 
      get 
      { 
       return count; 
      } 
      set 
      { 
       count = value; 
      } 
     } 

     public WordNode NextWord 
     { 
      get 
      { 
       return next; 
      } 
      set 
      { 
       next = value; 
      } 
     } 
    } 

ответ

0

Попробуйте это:

private void CountWords(string cleanString) 
{ 
    foreach (string stringWord in cleanString.Split(' ')) 
    { 
     if (head == null) 
     { 
      head = new WordNode(stringWord); 
     } 
     else 
     { 
      var last = (WordNode)null; 
      var current = head; 
      do 
      { 
       if (current.Word == stringWord) 
       { 
        break; 
       } 
       last = current; 
       current = current.NextWord; 
      } while (current != null); 
      if (current != null) 
      { 
       current.Count++; 
      } 
      else 
      { 
       last.NextWord = new WordNode(stringWord); 
      } 
     } 
    } 
} 

И альтернативой является использование Linq:

var query = 
    cleanString 
     .Split(' ') 
     .ToLookup(x => x) 
     .Select(x => new 
     { 
      Word = x.Key, 
      Count = x.Count(), 
     }); 
+0

Спасибо! Это делает трюк, хотя они не в алфавитном порядке (но я не указал это в своем первоначальном посте). – Gerald

+0

В мой linq-подход легко добавить метод сортировки. – Enigmativity

0

Это похоже на работу для Dictionary или here

Dictionary<string,int> myDict = new Dictionary<string,int>(); 

foreach(string str in listOfWords) 
{ 
    myDict.add(str,0); 
} 

foreach(string x in cleanText.split(' ')) 
{ 
if(myDict.ContainsKey(x)) 
    myDict[x]+=1; 
} 

После запуска через foreach myDict будет содержать подсчеты для каждого слова в «сумке слов».

Редактировать

if(myDict == null) 
    myDict = new Dictionary<string,int>(); //assuming running tally at higher scope. 


foreach(string x in cleanText.split(' ')) 
{ 
if(myDict.ContainsKey(x)) 
    myDict[x]+=1; 
else 
    myDict.add(x,1); 
} 
+0

это работает только если 'listOfWords' уже содержит все слова произведены, которые не имеют код это происходит. Почему бы просто не добавить количество новых слов «1», как вы идете? –

+0

Вы правы, я пропустил часть добавления узлов. –

0

Похоже, вы просто пытаетесь практиковать сделать связный список, чтобы это не могло бы быть полезным, но гораздо более простое решение заключается в использовании пара/значение ключа как словарь.

Dictionary<string, int> Words = new Dictionary<string, int>(); 
string wordsList = "a list of words for testing a list of words for testing"; 
foreach (string word in wordsList.Split(' ')) 
{ 
    if (Words[word] == null) 
     Words[word] = 1; 
    else 
     Words[word] += 1; 
} 
System.Console.WriteLine("testing: {0}", Words["testing"]); //result- testing: 2 

Результат индексации словарного словаря по строке вернет количество слов.

+0

Это вызовет «KeyNotFoundException» на первой итерации. Вы думаете о том, как работал «Hashtable»? Если бы вы заранее определили 'int count', тогда вы могли бы надежно назначить' Words [word] = Words.TryGetValue (word, out count)? счет + 1: 1'. (Или просто просто назовите его и добавьте его, поскольку он установил 'count' на' default (int) ', который является' 0', если ничего не было найдено, хотя есть кое-что такое небольшое недоразумение). –

Смежные вопросы