Доброго вечера формучане
Задание вот такое: "Текстовый файл 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();
}
}
}