2016-12-06 6 views
-1

Итак, у меня есть консольная программа VB.NET, где пользователь может ввести предложение, предложение затем разбивается на каждое слово и задается стоимость. Затем программа проверяет любые повторяющиеся слова и добавляет позицию, в которой повторяющиеся слова появляются с первой.VB.NET: Декомпрессия/Реформирование предложения из текстового файла EDIT: w/code

Например (как я понимаю, что не может быть хорошо объяснено): - входы пользователя «Привет, меня зовут привет» - Программа расщепляется предложения и присваивает значения, как, например: «Привет 1, мой 2, имя 3 , 4, привет 5 "(каждая пара слов и чисел находится в массивах) - Программа обнаруживает повторяющиеся слова и добавляет номера в первую очередь:« привет 1 5, мое 2, имя 3, 4 » - Слова и номера записываются в текстовый файл

Теперь слова необходимо прочитать из текстового файла. Я использую функции LineInput (1)/File Open для чтения из текстового файла и разделения каждой строки текстового файла на пробел, так что числа и слова являются отдельными. Однако при печати слов в консоль в качестве предложения слова с дубликатами появляются только один раз, поскольку они появляются только один раз в текстовом файле, но с двумя номерами.

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

Module Module1 
Dim i As Integer = 0 
Dim textInput As String 
Dim finalTextInput(1) As String 

Sub Main() 

    Console.WriteLine("Please enter your sentence(s)") 
    Dim sentence As String = Console.ReadLine() 

    Dim sentenceSplit() As String = sentence.Split(" ") 

    For Each element In sentenceSplit 
     sentenceSplit(i) = element & " " & i 
     i += 1 
    Next 

    Dim output As New Dictionary(Of String, String) 

    For Each current In sentenceSplit 
     ' split current input 
     Dim currentSplited = current.Split(" ") 
     Dim word = currentSplited(0) 
     Dim trailingNumbers = currentSplited(1) 

     ' if it already exists 
     If output.ContainsKey(word) Then 
      ' add trailing numbers 
      output(word) = output(word) & " " & trailingNumbers 
     Else 
      ' new input 
      output.Add(word, trailingNumbers) 
     End If 
    Next 

    ' create new array from dictionary 
    Dim newArray = output.Select(Function(x) x.Key & " " & x.Value).ToArray() 

    FileOpen(1, "compressed.txt", OpenMode.Output) 

    For Each element In newArray 
     PrintLine(1, element) 
    Next 
    FileClose(1) 


    Read() 
End Sub 
Sub Read() 
    Console.WriteLine("Would you like to decompress your sentences? Y/N") 
    Dim input As String = Console.ReadLine() 

    If input.ToLower() = "y" Then 

     FileOpen(1, "compressed.txt", OpenMode.Input) 

     Do Until EOF(1) 
      textInput = LineInput(1) 

      finalTextInput = textInput.Split(" ") 

      Console.Write(finalTextInput(0) & " ") 
     Loop 

     FileClose(1) 
    ElseIf input.Tolower() = "n" Then 
     Console.WriteLine("Thank you for using our system") 
     Threading.Thread.Sleep(2000) 
     End 
    Else 
     Console.WriteLine("Please choose one of the options") 
     Threading.Thread.Sleep(1500) 
     Console.Clear() 
     Read() 
    End If 
    Console.ReadKey() 
End Sub 

End Module

+1

Если вам нужна помощь в отладке кода, вероятно, вы должны включить свой код в вопрос. – Mark

+0

@Mark Хорошо, что я обычно делаю, но я думал, что этого объяснения было достаточно, поскольку я знаю, в чем проблема, просто нужно исправить –

ответ

0

Я предлагаю вам следующий код. Для сжатия строки мы разбиваем входной текст по пробелу, затем - зацикливание для каждого слова - мы продолжаем проверять, где в массиве появляется равная строка. В этом случае мы подставляем каждое равное слово индексом исходного.

Если слово уже обработано, оно будет представлено числом: поэтому, если мы найдем число, мы перейдем к следующему слову.

При заполнении цикла мы сохраняем файл.

Метод распаковки делает обратное.

'-- Compress and save 
    Dim ftext As String = "hello my name is hello and my greeting is hello is end" 
    Dim flist() As String = ftext.Split(" ") 

    For i As Integer = 0 To flist.Count - 1 

     If IsNumeric(flist(i)) Then Continue For 

     For k As Integer = i + 1 To flist.Count - 1 
      If flist(k) = flist(i) Then flist(k) = i.ToString() 
     Next 

    Next 

    IO.File.WriteAllText("c:\temp\hello.txt", String.Join(" ", flist.ToArray())) 

    '-- Read and decompress 
    Dim text As String = IO.File.ReadAllText("c:\temp\hello.txt") 
    Dim tlist As List(Of String) = text.Split(" ").ToList 

    For i As Integer = 0 To tlist.Count - 1 
     If IsNumeric(tlist(i)) Then 
      tlist(i) = tlist(Val(tlist(i))) 
     End If 
    Next 

    MsgBox(String.Join(" ", tlist.ToArray())) 

После компресса рутина, моя строка «привет мое имя привет и мое приветствие привет это конец» становится

enter image description here

и после декомпрессии он выглядит снова как и оригинальный

enter image description here

Надеется, что это помогает

+0

Спасибо за это, хотя я не уверен, что это совсем то, что мне нужно. Я отредактировал сообщение, чтобы включить мой код, чтобы вы могли видеть, что у меня есть. –

+0

Привет. Единственное, что меня отличает, - это используемые классы (я использовал массивы, в то время как вы использовали Словарь), и метод ввода входного текста (который я вложил в переменную для краткости). Могу ли я спросить, что вы имеете в виду, когда говорите, что это не то, что вам нужно? Мне кажется, результат правильный.Спасибо – hypnos

+0

Поскольку мои сжатые слова и цифры не записываются в текстовый файл так же, как и у вас, я не уверен, что это сработает –

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