如何对不同长度的字符串数组进行正确排序

问题描述 投票:0回答:1

我有一个关于使用 C# 排序的问题。我想实现一个函数来按字母顺序对字符串数组(例如 ["AA", "A", "Z", "ZZZ"])进行排序,而不需要任何内置排序方法。我尝试过一些比较函数和我的逻辑,即比较两个字符串的每个字符,但它无法正常工作。

如果您比较两个长度相同的字符串(例如“A”和“Z”),则效果很好。问题是“Z”出现在“AAA”之前,因为它是一个较短的字符串。

如果您能帮助我,我将不胜感激。谢谢你。

for (int i = 0; i < copy_database.Length - 1; i++)
                {
                    for (int j = 0; j < copy_database.Length - 1 - i; j++)
                    {
                        if (copy_database[j].Value != null && copy_database[j + 1].Value != null)
                        {
                            int k = 0;
                            while (k < Math.Min(copy_database[j].Value.Title.Length, copy_database[j + 1].Value.Title.Length) &&
                                copy_database[j].Value.Title[k] == copy_database[j + 1].Value.Title[k])
                            {
                                k++;
                            }

                            if (k < Math.Min(copy_database[j].Value.Title.Length, copy_database[j + 1].Value.Title.Length))
                            {
                                if (copy_database[j].Value.Title[k] < copy_database[j + 1].Value.Title[k])
                                {
                                    // Swap elements
                                    Key_Value_Pair temp = copy_database[j];
                                    copy_database[j] = copy_database[j + 1];
                                    copy_database[j + 1] = temp;
                                    break;
                                }
                            }
                            else
                            {
                                break;
                            }

c# algorithm sorting
1个回答
0
投票

请不要将所有内容都塞进一个例程中,提取方法。我们这里有

  1. 比较字符串
  2. 对数组进行排序

让我们先比较字符串

private static int CompareStrings(string left, string right) {
  if (left is null) 
    return right is null ? 0 : -1;
  
  if (right is null) 
    return +1;

  for (int i = 0; i < Math.Min(left.Length, right.Length); ++i) 
    if (left[i] < right[i])
      return -1;
    else if (left[i] > right[i])
      return +1;
  
  return left.Length < right.Length ? -1 
       : left.Length > right.Length ? +1 
       : 0;
}

然后对数组进行排序

private static void SortArray<T>(T[] array, Func<T, T, int> sort) {
  ArgumentNullException.ThrowIfNull(array);
  ArgumentNullException.ThrowIfNull(sort);

  for (bool hasWork = true; hasWork;) {
    hasWork = false;

    for (int i = 0; i < array.Length - 1; ++i) {
      if (sort(array[i], array[i + 1]) > 0) {
        hasWork = true;

        (array[i], array[i + 1]) = (array[i + 1], array[i]);
      }
    }
  }
}

最后我们可以放

SortArray(copy_database, CompareStrings);
© www.soinside.com 2019 - 2024. All rights reserved.