Сортировка текстового файла - C# (180546)

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста разобраться. У меня vs 2015 c#. Необходимо произвести сортировку текстового файла, чтобы строки в нем находились в алфавитном порядке. При сортировке строк, содержащих внутри себя числа, сортировать их в порядке возрастания чисел. Сие чудо вполне производит все должным образом:
namespace TextSorting
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 1) // если передан путь
            {
                try
                {
                    string[] rows = File.ReadAllLines(args[0]); // загрузить
                    Array.Sort(rows, new NaturalSort()); // отсортировать
                    File.WriteAllLines("res" + args[0], rows); // сохранить
                    Console.WriteLine("Text sorting is successful");
                }
                catch (Exception)
                {
                    Console.WriteLine("Text sorting is unsuccessful");
                }
            }
            else
            {
                return;
            }
            Console.ReadKey(true);
        }
 
        public class NaturalSort : IComparer<string>
        {
            /// <summary>
            /// Функция сравнения строк, с учетом регистра
            /// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            public int Compare(string x, string y)
            {
                int ix, iy;
                return IsNumbers(x, out ix) && IsNumbers(y, out iy) ? ix.CompareTo(iy) : 
                    string.Compare(x, y, true, new CultureInfo("en-US")); // сравнить два числа, или сравнить как строки
            }
 
            /// <summary>
            /// Содержит ли строка число (числа). Возвращает также первое найденное число в строке
            /// </summary>
            /// <param name="s"></param>
            /// <param name="i"></param>
            /// <returns></returns>
            private bool IsNumbers(string s, out int i)
            {
                Match match = Regex.Match(s, @"\d+");
                i = match.Success ? Convert.ToInt32(match.Value) : 0;
                return match.Success;
            }
        }
    }
}
ОДНАКО! Если программа в строке встречает первую цифру, то сортирует по ней, но если после первой цифры (спустя буквы) есть еще одна, то она считывает продолжение как обычные "буквы".. Допустим, мы берем текстовый файл данного вида:

a1bc10def1 a1bc9def1 a1bc40def1 a1bc10dcf1 a1bc10def20 a1bc10def0

то на выходе мы получим точно такой же файл с тем же порядком строк. Как это исправить?

Решение задачи: «Сортировка текстового файла»

textual
Листинг программы
public class NaturalSort : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (string.Equals(x,y)) return 0;
        
        int len = Math.Min(x.Length, y.Length), i=0, j=0;
        for (; i<len && j<len;)
        {
            int ii=i+1, jj=j+1;
            bool dx = char.IsDigit(x[i]), dy = char.IsDigit(y[j]);
            if (dx && dy)
            {
                while (ii<x.Length && char.IsDigit(x[ii])) ii++;
                while (jj<y.Length && char.IsDigit(y[jj])) jj++;
                
                int n1 = int.Parse(x.Substring(i, ii-i));
                int n2 = int.Parse(y.Substring(j, jj-j));
                if (n1 < n2) return -1;
                if (n1 > n2) return 1;
            }
            else
            {
                while (ii<x.Length && dx == char.IsDigit(x[ii])) ii++;
                while (jj<y.Length && dy == char.IsDigit(y[jj])) jj++;
                
                int result = string.Compare(x, i, y, j, Math.Max(ii-i, jj-j));
                if (result != 0) return result;
            }
            i=ii; j=jj;
        }
        if (i == x.Length && j < y.Length) return -1;
        if (i < x.Length && j == y.Length) return 1;
        return 0;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы