Отсортировать слова заданного текста, начинающиеся с гласных букв, по второй букве - C#
Формулировка задачи:
1)Отсортировать слова заданного текста, начинающиеся с гласных букв, по второй букве
с помощью StringBuildera.
2)Модифицировать предыдущее задание следующим образом:
-для букв, слов, предложений, знаков препинания и текста создать отдельные классы. Слово должно состоять из массива букв, предложения из массива слов и знаков препинания, текст из массива предложений. Заменить последовательность табуляций и пробелов одним пробелом.
-создать класс, состоящий из исполнительного метода, который выполняет описанное действие с предыдущего задания, но в качестве типов использует созданные классы.
Первое еще могу (точнее имею представление), но второе, может кто знает...
Вдруг Вам делать нечего), я понимаю это сложно?
В интернете нашла следующее
StringBuilder sb = new StringBuilder();
sb.AppendLine("3333");
sb.AppendLine("2222");
sb.AppendLine("1111");
List<string> items = new List<string>(sb.ToString().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries));
items.Sort();
sb = new StringBuilder(string.Join("\r\n", items.ToArray()));Решение задачи: «Отсортировать слова заданного текста, начинающиеся с гласных букв, по второй букве»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication207
{
class Program
{
static void Main(string[] args)
{
var text = Text.Parse("Мама мыла раму, а папа мыл аккордеон. Детишки весело играли, пока Матроскин воблу жрал.");
//get words from all sentences
var words = new List<Word>();
foreach (var sent in text)
foreach (var word in sent)
if(word is Word)
words.Add(word as Word);
//sort
words.Sort(new WordComparer());
//output
foreach(var w in words)
Console.WriteLine(w);
Console.ReadLine();
}
}
class Letter
{
public Char Value;
}
interface ISentenceToken
{
}
class Punctuation : ISentenceToken
{
public Char Value;
}
class Word : List<Letter>, ISentenceToken
{
public override string ToString()
{
var sb = new StringBuilder();
foreach (var c in this)
sb.Append(c.Value);
return sb.ToString();
}
}
class Sentence : List<ISentenceToken>
{
}
class Text : List<Sentence>
{
public static Text Parse(string text)
{
//state machine
var res = new Text();
var sentence = new Sentence();
var word = new Word();
foreach(var c in text)
{
if (char.IsPunctuation(c) || char.IsSeparator(c))
{
if (word.Count > 0)
{
sentence.Add(word);
word = new Word();
}
switch (c)
{
case '.':
case '!':
case '?':
res.Add(sentence);
sentence.Add(new Punctuation { Value = c });
sentence = new Sentence();
break;
case '\r':
case '\n':
case '\t':
case ' ': break;//ignore space symbols
default:
sentence.Add(new Punctuation { Value = c });
break;
}
}
else
word.Add(new Letter{Value = c});
}
return res;
}
}
class WordComparer : IComparer<Word>
{
public int Compare(Word x, Word y)
{
//compare words by second letter (only if the words start with vowel letter)
if (x.Count == 0 || y.Count == 0) return x.Count.CompareTo(y.Count);
if (!IsVowel(x[0].Value) || !IsVowel(y[0].Value)) return IsVowel(x[0].Value).CompareTo(IsVowel(y[0].Value));
if (x.Count < 2 || y.Count < 2) return x.Count.CompareTo(y.Count);
return x[1].Value.CompareTo(y[1].Value);
}
bool IsVowel(char c)
{
return "уеыаоэяию".Contains(char.ToLower(c).ToString());
}
}
}