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是的,谢谢!更新。。。他是徒手写的