2017-01-17 4 views
1

HINWEIS: Dies ist kein Duplikat, ähnliche Fragen nach Namen und Thema erklären dies nicht.Index war außerhalb der Grenzen des Arrays - For Schleife

Ich versuche, ein Array von Zahlen in numerischer Reihenfolge zu sortieren, während auch alle Zahlen, die um eins von der vorherigen inkrementieren, zusammenfallen, so dass 921.922.923 zu 921-923 wird.

Der Code, den ich schrieb:

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

Dies ist, was ich benutzen musste:

Die Funktion sollte drehen dies:

892, 893, 894, 895, 906, 920, 845

Zu diesem:

845, 892-895, 906, 910

Dies ist, wie es nur für zusätzliche Informationen ausgeführt wurde:

public static void Main(string[] args) 
    { 
     int[] input = {892, 893, 894, 895, 906, 845}; 
     Console.WriteLine(FormatReceiptNumbers(input)); 
     Console.ReadLine(); 
    } 

jedoch bei der Ausführung, es gibt diesen:

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
    at Rextester.Program.FormatReceiptNumbers(Int32[] numbers) 
    at Rextester.Program.Main(String[] args) 

HINWEIS: Ich verwende einen Online-Compiler, der den Rextester erklärt Ich bin ziemlich sicher, dass dies nicht die Ursache des Problems ist.

Wenn jemand mir helfen könnte, die Ursache des Problems zu verstehen, würde ich es sehr schätzen. Ich sehe nicht, wie x (oder y?) Außerhalb der Grenzen gehen kann, da ich das Limit für die Array-Länge gesetzt habe. Danke im Voraus!

Antwort

1

Das Problem ist, mit dieser Zeile:

if (x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1) 

Sie Doppeland Zeichen verwenden sollten && (dh logischeand) statt einzigenand Zeichen & (die binäreand ist)

Wenn x = 0, Sie haben sortedNumbers[-1], wodurch das Array Out-of-Bounds-Index haben -> das wird immer noch ausgeführt und nicht sortieren circuited, wenn Sie & anstelle von && verwenden.

+1

Danke, ich werde dies als die Antwort markieren, wenn ich kann. Das passiert, wenn Sie einen Online-Compiler verwenden, ohne zu sagen, was ich falsch mache. –

+1

Ah ja, so könnte es passieren. ;) – Ian

1

Es war wegen der Bedingung, die Sie verwenden (if(x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1)). Obwohl sowohl & als auch && zum Vergleich verwendet werden, wertet die & im Vergleich immer auch die zweite Bedingung aus, während && die zweite Bedingung nicht auswertet, wenn die erste Bedingung als falsch ausgewertet wird.

sollte es so sein:

if (x > 0 && sortedNumbers[x] == sortedNumbers[x - 1] - 1) 
1

Falls Sie es brauchen.:)

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

Das wird mir gut tun, danke eine Tonne! –

Verwandte Themen