Как отсортировать целочисленные строки?

e.preventDefault(); будет препятствовать отправке формы. И это хорошо. Но после того, как вы сделали свои расчеты, вам нужно будет отправить форму. Поэтому добавьте $("#distance_form").submit();, и данные формы будут отправлены.

11
задан Michael Myers 24 April 2009 в 15:44
поделиться

6 ответов

Вы ищете Алфавитный алгоритм . К счастью для вас, ряд реализаций уже существует. См. здесь .

17
ответ дан 3 December 2019 в 03:53
поделиться

То, что вы ищете, - это естественная сортировка.

Джефф Этвуд однажды сделал отличную запись в своем блоге, объясняя концепцию и ссылаясь на различные другие источники с алгоритмами, которые вы могли бы использовать как Пример.

Сортировка для людей: естественный порядок сортировки

3
ответ дан 3 December 2019 в 03:53
поделиться

Вот как я решил это для нашего приложения, порядок будет такой же, как в каталоге Windows:

public class NaturalSortComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }

    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    public static extern int StrCmpLogicalW(string x, string y);
}

Использование:

  NaturalSortComparer comparer = new NaturalSortComparer();
  return comparer.Compare(string1, string2);

Но это, вероятно, не совсем то, что вы хотите:

/ / A1, A2, A10, B1, B3, 5, 7, 50, 72

Это даст

// 5, 7, 50, 72, A1, A2, A10, B1, B3

5
ответ дан 3 December 2019 в 03:53
поделиться

Вот пользовательский компаратор, который отсортирует ваш требуемый заказ. Обратите внимание, что в этом коде нет проверок ошибок / исправности: предполагается, что все строки будут в правильном формате.

public class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        Match xMatch = Regex.Match(x, @"^(\D*)(\d+)$");
        Match yMatch = Regex.Match(y, @"^(\D*)(\d+)$");

        string xChars = xMatch.Groups[1].Value;
        string yChars = yMatch.Groups[1].Value;

        if ((xChars.Length == 0) && (yChars.Length > 0))
        {
            return 1;
        }
        else if ((xChars.Length > 0) && (yChars.Length == 0))
        {
            return -1;
        }
        else
        {
            int charsResult = xChars.CompareTo(yChars);

            return (charsResult != 0)
                ? charsResult
                : int.Parse(xMatch.Groups[2].Value)
                    .CompareTo(int.Parse(yMatch.Groups[2].Value));
        }
    }
}

Вы можете использовать его следующим образом:

List<string> testList =
    new List<string>() { "B1","5","50","A10","7","72","B3","A1","A2" };

testList.Sort(new MyComparer());    // A1, A2, A10, B1, B3, 5, 7, 50, 72
1
ответ дан 3 December 2019 в 03:53
поделиться

Ну, вы всегда можете вызвать функцию Win32 API StrCmpLogicalW , которая делает именно то, что вы хотите (это то, что Explorer использует для сортировки имен файлов). Единственный возможный недостаток - это то, что сортировка нечувствительна к регистру.

0
ответ дан 3 December 2019 в 03:53
поделиться

Не уверен насчет производительности, и уверен, что это можно оптимизировать, но это делает работа:

string[] sort(string[] data)
{
    return data
        .OrderBy(s => Regex.Match(s, @"^\D").Length == 0)
        .ThenBy(s => Regex.Match(s, @"\D*").Value)
       .ThenBy(s => Int32.Parse(Regex.Match(s, @"\d+").Value)).ToArray();
}

var result = sort(new string[] { "B1", "5", "50", "A10", "7", "72", "B3", "A1", "A2" });
0
ответ дан 3 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: