@Retr0Hacker

Как найти все вхождения слова в строку и перенести их в начало строки?

Доброго вечера формучане

Задание вот такое: "Текстовый файл L4_16T.txt содержит текст. Разделители известны. Переместите каждое самое длинное слово, начинающееся с uppercase буквы, в начало строки с разделителями позади. Запишите измененный текст в отдельный файл результатов Results.txt. Подготовьте файл анализа Analysis.txt в формате таблицы (2 столбца): номер строки, слово, начинающееся с заглавной (верхней) буквы."

Не получается нормально реализовать перенос слов в строку, если в строке есть два и более одинаковых самых длинных слово, начинающихся с uppercase буквы.

Все потому что я ищу максимальные слова в строке через IndexOf, который возвращает первое вхождение элемента. И так как у меня несколько раз в строке встречается одно и тоже слово, то программа каждый раз переносит в начало одно и тоже слово. А мне нужно чтобы перенеслись все слова.

Приведу пример. Есть вот такая строка:

" ,,,,,,,,,,,,,,,,,,,,,,,,Sdfsdf;;;;;;;;;;;;;;;sdfh Sdfsdf,,,,,,,,,,,,,,,,,,,,. Sdfsdf aaaaaaaaaaaaaaaaaaaaaaaaaa Mdfsdf,,,,,,,,,"

На выходе я должен получить следующее:

"Mdfsdf,,,,,,,,,Sdfsdf Sdfsdf,,,,,,,,,,,,,,,,,,,,.Sdfsdf;;;;;;;;;;;;;;; ,,,,,,,,,,,,,,,,,,,,,,,,sdfh aaaaaaaaaaaaaaaaaaaaaaaaaa"

Но пока что получаю только вот такую строку:

"Mdfsdf,,,,,,,,,Sdfsdf;;;;;;;;;;;;;;;sdfh kj ,,,,,,,,,,,,,,,Sdfsdf,,,,,,,,,,,,,,,,,,,,. Sdfsdf aaaaaaaaaaaaaaaaaaaaaaaaaa ,,,,,,,,,"

Подскажите как можно это решить?

Код программы:
using System;
using System.IO;
using System.Text;
 
namespace LAB_4_2
{
    internal class Program
    {
        const string strFile = "TextFile.txt";
        const string resFile = "Result.txt";
        const string aFile = "Analiz.txt";
 
        static void Main(string[] args)
        {
            char[] delimiters = { ' ', '.', ',', ';', ':', '[', ']', '(', ')', '!', '?', '\t', '\n' };
            Process(strFile, aFile, resFile, delimiters);
        }
 
        static void Process(string strFile, string aFile,
                            string resFile, char[] delimiters)
        {
            using (StreamReader readStr = new StreamReader(strFile, Encoding.GetEncoding(1257)))
            {
                using (StreamWriter writeA = new StreamWriter(aFile))
                {
                    using (StreamWriter writeRes = new StreamWriter(resFile))
                    {
                        string top = "----------------------------\n" +
                                 "| Line № | Longest word    |\n" +
                                 "----------------------------";
                        writeA.WriteLine(top);
                        string line;
                        int countline = 1;
 
                        while ((line = readStr.ReadLine()) != null) {
                            if (line.Length >= 0) {
                                string AllMaxWords = "";
                                string[] longestWords = FindMaxWords(line, delimiters, ref AllMaxWords);
 
                                if (AllMaxWords.Length == 0)
                                    writeA.WriteLine("|   {0, -4} | {1, -15} |", countline, "No words found");
                                else
                                    for (int i = 0; i < longestWords.Length; i++)
                                    {
                                        if (longestWords[i] == "")
                                            continue;
                                        writeA.WriteLine("|   {0, -4} | {1, -15} |", countline, longestWords[i]);
                                        MoveToStart(ref line, longestWords[i], line.IndexOf(longestWords[i]));
                                    }
                                countline++;
 
                                writeRes.WriteLine(line);
                            }
                        }
                        writeA.WriteLine("----------------------------");
                    }
                }
            }
        }
 
        static void MoveToStart(ref string myLine, string word, int start)
        {
            string tempLine = string.Empty;
            int index = myLine.IndexOf(word) + word.Length;
 
            while (index < myLine.Length)
            {
                if (myLine[index] == ' ')
                {
                    tempLine += " ";
                    break;
                }
                else
                {
                    tempLine += myLine[index];
                    index++;
                }
            }
 
            string myLine1 = myLine.Remove(start, word.Length);
            myLine1 = myLine1.Remove(myLine1.IndexOf(tempLine), tempLine.Length);
            
            myLine = myLine1.Insert(0, word+tempLine);
        }
 
        static int MaxWordLength(string line, char[] delimiters)
        {
            int maxlength = 1;
            string[] words = line.Split(delimiters,
                StringSplitOptions.RemoveEmptyEntries);
 
            for (int i = 0; i < words.Length; i++)
            {
                if (Char.IsUpper(words[i][0]) && 
                    maxlength < words[i].Length)
                {
                    maxlength = words[i].Length;
                }
            }
 
            return maxlength;
        }
 
        static string[] FindMaxWords(string line, char[] delimiters, ref string AllMaxWords)
        {
            string[] temp = line.Split(delimiters, 
                                       StringSplitOptions.RemoveEmptyEntries);
            int maxlength = MaxWordLength(line, delimiters);
 
            for (int i = 0, k = 0; i < temp.Length; i++, k++)
            {
                if (Char.IsUpper(temp[i][0]) && 
                    maxlength == temp[i].Length)
                {
                    AllMaxWords += temp[k] + " ";
                }
            }
            return AllMaxWords.Split();
        }
    }
}
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
У IndexOf если аргумент, откуда начинать поиск.
Да и задача решается в 3 подхода: разбить на слова, отсортировать по условию, склеить обратно в строку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы