你能帮帮忙吗?
我需要按字典顺序比较两个数组:如果其中一个比其他数组短,则首先按字典顺序排列。如果它们的长度相同,则必须逐个元素地进行比较。如果元素在字母表中位于另一个元素之前,则该数组首先按字典顺序排列。
这是我的代码:
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;?
答案 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.");
}
}
}
}
}