Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按字典顺序比较两个字符数组_C#_Arrays_Char_Compare - Fatal编程技术网

C# 按字典顺序比较两个字符数组

C# 按字典顺序比较两个字符数组,c#,arrays,char,compare,C#,Arrays,Char,Compare,你能帮忙吗 我需要比较两个数组的词典:如果其中一个数组比另一个数组短,那么它首先是词典。如果它们的长度相同,则必须逐个元素进行比较。如果一个元素在字母表中位于另一个元素之前,则该数组按字典顺序排在第一位 这是我的密码: using System; internal class CompareTwoCharArraysLexicographically { private static void Main() { char[] firstArray = {'a',

你能帮忙吗

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

这是我的密码:

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.");
       }
    }
}

如何避免三次重复消息两个数组相等

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

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); 
    }
}

还有另一种结构化的方法:

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.");
      }
   }
以下是我的建议:

        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;
                }          
            }                          

下面是一个相对简单的实现,使用数组字符的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");
        }
    }
}

我认为这解决了你的问题: 希望我也帮了你你帮我找到了一个练习的答案

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.");
                }
            }
        }
    }
}

只要在知道comparisoncode的状态后添加break语句,例如,使用简单/可读的逻辑/应该调试的循环,学习在测试所有编写的代码时使用调试器,不管代码看起来多么逻辑和完美。首先比较长度不是词典学的。你说的字母表是什么意思?你应该是,我想是的。@JeppeStigNielsen是的,谢谢!更新。。。他是徒手写的