按字典顺序比较两个char数组

时间:2015-02-01 18:43:30

标签: c# arrays char compare

你能帮帮忙吗?

  

我需要按字典顺序比较两个数组:如果其中一个比其他数组短,则首先按字典顺序排列。如果它们的长度相同,则必须逐个元素地进行比较。如果元素在字母表中位于另一个元素之前,则该数组首先按字典顺序排列。

这是我的代码:

using System;

internal class CompareTwoCharArraysLexicographically
{
    private static void Main()
    {
       char[] firstArray = {'a', 'b', 'c', 'z'};
       int firstArrayLength = firstArray.Length;
       char[] secondArray = {'a', 'b', 'c', 'd'};
       int secondArrayLength = secondArray.Length;
       int length = Math.Min(firstArray.Length, secondArray.Length);

       if (firstArray.Length > secondArray.Length)
       {
          Console.WriteLine("Second array is earlier.");
       }

       else if (firstArray.Length == secondArray.Length)
       {
          for (int i = 0; i < length; i++)
          {
              if (firstArray[i] > secondArray[i])
              {
                  Console.WriteLine("2 array is earlier.");
                  break;
              }
              else if (secondArray[i] > firstArray[i])
              {
                  Console.WriteLine("1 array is earlier."); 
                  break;
              }
              else
              {
                  Console.WriteLine("Two arrays are equal.");
              }
          }
       }
       else
       {
          Console.WriteLine("First array is earlier.");
       }
    }
}

如何避免三次重复的消息&#34;两个数组相等。&#34;?

5 个答案:

答案 0 :(得分:4)

另一种结构化方式:

class LexicographicCharArrayComparer : Comparer<char[]>
{
    public override int Compare(char[] x, char[] y)
    {
        if (x == null || y == null)
            return Default.Compare(x, y);

        int lengthComp = x.Length.CompareTo(y.Length);
        if (lengthComp != 0)
            return lengthComp;

        return StringComparer.Ordinal.Compare(new string(x), new string(y));
    }
}

用法:

        char[] firstArray = { 'a', 'b', 'c', 'z', };
        char[] secondArray = { 'a', 'b', 'c', 'd', };

        var comparer = new LexicographicCharArrayComparer();
        var result = comparer.Compare(firstArray, secondArray);
        if (result < 0)
            Console.WriteLine("1st array is earlier");
        else if (result == 0)
            Console.WriteLine("The two arrays are equal");
        else
            Console.WriteLine("2nd array is earlier");

当然,你自己的方法可以修复。将中间块更正为:

   else if (firstArray.Length == secondArray.Length)
   {
      bool resolved = false;
      for (int i = 0; i < length; i++)
      {
          if (firstArray[i] > secondArray[i])
          {
              Console.WriteLine("2 array is earlier.");
              resolved = true;
              break;
          }
          if (secondArray[i] > firstArray[i])
          {
              Console.WriteLine("1 array is earlier."); 
              resolved = true;
              break;
          }
      }
      if (!resolved)
      {
          Console.WriteLine("Two arrays are equal.");
      }
   }

答案 1 :(得分:0)

我认为您需要使用跟踪变量来了解数组是否相等。目前,您说每次同一索引中的两个项目相等时它们是相等的。相反,请考虑以下代码:

else if (firstArray.Length == secondArray.Length)
{
    var largerArray = 0;

    // Compare each item in the array
    for (int i = 0; i < length; i++)
    {
        // As soon as two items are not equal, set the comparison value and break
        if (firstArray[i] > secondArray[i])
        {
            largerArray = 1;
            break;
        }
        else if (secondArray[i] > firstArray[i])
        {
            largerArray = 2
            break;
        }
    }

    // Check the largerArray value. If it was never changed, the arrays are equal
    // Otherwise, display a message based on the value of the largerArray.
    if (largerArray == 0)
    {
        Console.WriteLine("Two arrays are equal.");
    }
    else
    {
        Console.WriteLine("{0} array is earlier.", largerArray); 
    }
}

答案 2 :(得分:0)

这是我的建议:

        Console.Write("Enter a positive number for length of the first array: ");
        int n = int.Parse(Console.ReadLine());
        Console.Write("Enter a positive number for length of the second array: ");
        int m = int.Parse(Console.ReadLine());

        // Declare and create the arrays
        char[] firstArray = new char[n];
        char[] secondArray = new char[m];

        Console.WriteLine("Enter values of the arrays: ");
        for (int i = 0; i <  firstArray.Length; i++)
        {
            firstArray[i] = char.Parse(Console.ReadLine());
        }
        Console.WriteLine();

        for (int i = 0; i < m; i++)
        {
            secondArray[i] = char.Parse(Console.ReadLine());
        }
        Console.WriteLine();

        // Print them on the console
        for (int i = 0; i < n; i++)
        {
            Console.Write(" " + firstArray[i]);
        }            
        Console.WriteLine();

        for (int i = 0; i < m; i++)
        {
            Console.Write(" " + secondArray[i]);
        }            
        Console.WriteLine();

        int minLength = Math.Min(firstArray.Length, secondArray.Length);
        bool equalValues = true;

        // Search which of the arrays is lexicographically earlier
            for (int i = 0; i < minLength; i++)
            {
                if (firstArray[i] == secondArray[i])
                {
                    continue;
                }
                else if (firstArray[i] < secondArray[i])
                {
                    Console.WriteLine("The first array is earlier.");
                    break;
                }
                else if (firstArray[i] > secondArray[i])
                {
                    Console.WriteLine("The second array is earlier.");
                    break;
                }
            }
            for (int i = 0; i < minLength; i++)
            {
                if (firstArray[i] != secondArray[i])
                {
                    equalValues = false;
                }
            }
            // This is to indicate the values of the two arrays till the element of index minLength-1 are equal
            for (int i = 0; i < minLength; i++)
            {
                if (equalValues && n < m)
                {
                    Console.WriteLine("The first array is earlier.");
                    break;
                }   
                else if (equalValues && n > m)
                {
                    Console.WriteLine("The second array is earlier.");
                    break;
                }
                else if (equalValues && n == m)
                {
                    Console.WriteLine("The two arrays aree equal.");
                    break;
                }          
            }                          

答案 3 :(得分:0)

这是一个相对简单的实现,使用数组字符的ASCII值之和作为词典比较标准:

/*  Method: compareLexicographically(a, b);
    Compare lexicographically the two arrays passed as parameters and print result.
    Comparison criteria:
    1. Arrays lengths.
    2. Accumulated ASCII values of the array characters. 
*/
static void compareLexicographically(char[] a, char[] b)
{
    if (a.Length == b.Length) // same lengths
    {
        int suma = 0;
        int sumb = 0;
        for (int i = 0; i < a.Length; i++)
        {
            suma += a[i];
            sumb += b[i];
        }

        if (suma == sumb)
        {
            Console.WriteLine("Two arrays are lexicographically equal.\n");
        }
        else
        {
            if (suma < sumb)
            {
               Console.WriteLine("First array lexicographically smaller than second.\n");
            }
            else
            {
                Console.WriteLine("First array lexicographically greater than second.\n");
            }
        }
    }
    else  // different lengths
    {
        if (a.Length < b.Length)
        {
            Console.WriteLine("First array lexicographically smaller than second.\n");
        }
        else
        {
            Console.WriteLine("First array lexicographically greater than second.\n");
        }
    }
}

答案 4 :(得分:0)

我认为这可以解决您的问题:) 希望我也能帮助您,您能帮助我找到锻炼的答案

using System;

internal class CompareTwoCharArraysLexicographically
{
    private static void Main()
    {
        char[] firstArray = { 'a', 'b', 'c', 'z' };
        int firstArrayLength = firstArray.Length;
        char[] secondArray = { 'a', 'b', 'c', 'd' };
        int secondArrayLength = secondArray.Length;
        int length = Math.Min(firstArray.Length, secondArray.Length);
        bool same = false;

        if (firstArray.Length > secondArray.Length)
        {
            Console.WriteLine("Second array is earlier.");
        }

        else if (firstArray.Length == secondArray.Length)
        {
            for (int i = 0; i < length; i++)
            {
                if (firstArray[i] != secondArray[i])
                {
                    same = false;


                    if (firstArray[i] > secondArray[i])
                    {
                        Console.Clear();
                        Console.WriteLine("2 array is earlier.");
                        break;
                    }
                    if (secondArray[i] > firstArray[i])
                    {
                        Console.Clear();
                        Console.WriteLine("1 array is earlier.");
                        break;
                    }

                }



                else same = true;


                if (same == true)
                {
                    Console.Clear();
                    Console.WriteLine("Two arrays are equal."); 

                }

                else
                {
                    Console.WriteLine("First array is earlier.");
                }
            }
        }
    }
}