2015-02-01 4 views
2

Вы можете помочь с этим?Сравнить lexicographically 2 char arrays

Мне нужно сравнить лексикографически два массива: если один из них короче другого, он сначала лексикографический. Если их длина одинакова, их нужно сравнивать по элементам. Если элемент находится перед другим в алфавите, этот массив сначала лексикографически.

Вот мой код:

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

Как я могу избежать три раза повторенное сообщения «Два массива равен.»?

+0

просто добавьте 'break' заявления, как только вы знаете, статус коды сравнения –

+2

, как эта простой/читаемую логика/петли должны быть' debugged' узнать т o использовать отладчик, когда вы тестируете весь код, который вы пишете, независимо от того, насколько логичным и безупречным может казаться код. – MethodMan

+1

Сравнение длины сначала _not_ lexicographic. –

ответ

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

Спасибо, сейчас он отлично работает. – locke

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

Ваш '<>' должен быть '! =', я думаю. –

+0

@ JeppeStigNielsen да, спасибо! обновленный ... был документ от руки. :( –

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