注意:这不是重复的,类似的问题按名称和主题不解释。
我正在尝试按照数字顺序对数字数组进行排序,同时还会折叠前一个增加1的任何数字,因此921,922,923变为921-923。
我写的代码是:
static string FormatReceiptNumbers(int[] numbers)
{
int[] sortedNumbers = numbers;
Array.Sort(sortedNumbers);
string output = "";
//Sort through each element
for(int x = 0; x < sortedNumbers.Length; x++)
{
//Check for Incrementing value
if(x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1)
{
//Check if incrementing value doesn't keep going
for(int y = x; y < sortedNumbers.Length; y++)
{
//check if incrementing values end
if(sortedNumbers[y] != sortedNumbers[y - 1] - 1)
{
output = output + " - " + sortedNumbers[y];
//Check if at end of array
if(y != sortedNumbers.Length)
{
x = y; //Keep going
break;
}
else
{
output.Remove(0, 2);
return output;
}
}
}
}
//if no incrementing value is found add number to input
else
{
output = output + ", " + sortedNumbers[x].ToString();
}
}
//Each addition to the string adds ", " to beginning, remove the first one, and return value
return output.Remove(0, 2);
}
这是我必须使用的:
该功能应该转为:
892,893,894,895,906,920,845
To This:
845,892 - 895,906,910
这是为了获取额外信息而执行的方式:
public static void Main(string[] args)
{
int[] input = {892, 893, 894, 895, 906, 845};
Console.WriteLine(FormatReceiptNumbers(input));
Console.ReadLine();
}
然而,在执行时,它会返回:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Rextester.Program.FormatReceiptNumbers(Int32[] numbers)
at Rextester.Program.Main(String[] args)
注意:我正在使用在线编译器来解释Rextester我很确定这不是问题的原因。
如果有人能帮我理解问题的原因,我将不胜感激。我没有看到x(或y?)如何超出界限,因为我已经设置了数组长度的限制。提前谢谢!
答案 0 :(得分:1)
问题在于这一行:
if (x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1)
您应该使用双 and
符号&&
(即逻辑 and
)而不是单 and
签署&
(二进制 and
)
当x = 0
时,您拥有sortedNumbers[-1]
,使数组具有越界索引 - &gt;如果您使用&
代替&&
,则仍会执行此操作并且不会进行排序。
答案 1 :(得分:1)
这是因为你正在使用的条件(if(x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1)
)。即使&
和&&
都用于比较,比较中的&
也会始终评估第二个条件,而&&
不会评估第二个条件第一个条件评估为false。
它应该是这样的:
if (x > 0 && sortedNumbers[x] == sortedNumbers[x - 1] - 1)
答案 2 :(得分:1)
如果您需要它。 :)
static void Main(string[] args)
{
int[] input = { 892, 893, 894, 895, 906, 920, 845 };
string output = FormatReceiptNumber(input);
Console.WriteLine(output);
Console.ReadKey();
}
private static string FormatReceiptNumber(int[] numbers)
{
Array.Sort(numbers);
string output = "";
for (int loop = 0; loop < numbers.Length - 1; loop++)
{
int? start = null, end = null;
while (numbers[loop + 1] - numbers[loop] == 1)
{
if (start == null)
{
start = numbers[loop];
}
end = numbers[loop + 1];
loop++;
}
if (start != null && end != null)
{
output += start + "-" + end + ", ";
}
else
{
output += numbers[loop].ToString() + ", ";
}
}
output += numbers[numbers.Length - 1].ToString();
return output;
}