2016-07-22 34 views
0

Ich habe einige Monate in ein Array aus einer externen Textdatei eingelesen und ich muss die Monate in ein Array konvertieren, das den Wert der Monate z. Januar = 1, Februar = 2 usw. Damit können sie dann durch Quicksort gestellt werden.Konvertieren Monate zu Zahlenäquivalent zur Verwendung in Quicksort

public static void Main(string[] args) 
    { 
     //Read external files into arrays. 
     string[] Month = File.ReadLines(@"Month.txt").ToArray(); 
     string[] Year = File.ReadLines(@"Year.txt").ToArray(); 

     //Convert arrays from string to double to be used in sort. 
     double[] YearSort = Array.ConvertAll(Year, double.Parse); 

     int UserInput1; 

     //Create new array that will hold selected array to be used in sort. 
     double[] data = new double[1022]; 
     //Prompt user to select action. 
    Console.WriteLine("Press 1 to Sort by month or 2 to sort by year."); 
    UserInput1 = Convert.ToInt32(Console.ReadLine()); 

    if(UserInput1 == 1) 
    { 
     Array.Copy(Month,data,1022); 
     QuickSort(data); 
     for (int i = 0; i < 1022; i++) 
    Console.WriteLine(data[i]); 
    Console.WriteLine(); 
    } 
    else if (UserInput1 == 2) 
    { 
     Array.Copy(YearSort,data,1022); 
     QuickSort(data); 
     for (int i = 0; i < 1022; i++) 
    Console.WriteLine(data[i]); 
    Console.WriteLine(); 
    } 
    else 
    { 
     Console.WriteLine("Please try again and select a valid option"); 
    } 
    } 

static int MonthToDouble(string Month) 
     { 
      int NewMonth = 0; 

      switch(Month) 
      { 
       case "January": 
       case "january": 
        NewMonth = 1; 
        break; 
       case "February": 
       case "february": 
        NewMonth = 2; 
        break; 
       case "March": 
       case "march": 
        NewMonth = 3; 
        break; 
       case "April": 
       case "april": 
        NewMonth = 4; 
        break; 
       case "May": 
       case "may": 
        NewMonth = 5; 
        break; 
       case "June": 
       case "june": 
        NewMonth = 6; 
        break; 
       case "July": 
       case "july": 
        NewMonth = 7; 
        break; 
       case "August": 
       case "august": 
        NewMonth = 8; 
        break; 
       case "September": 
       case "september": 
        NewMonth = 9; 
        break; 
       case "October": 
       case "october": 
        NewMonth = 10; 
        break; 
       case "November": 
       case "november": 
        NewMonth = 11; 
        break; 
       case "December": 
       case "december": 
        NewMonth = 12; 
        break; 
      } 

      return NewMonth; 
     } 

     static string DoubleToMonth(double Month) 
     { 
      string NewMonth = ""; 

      switch ((int)Month) 
      { 
       case 1: 
        NewMonth = "January"; 
        break; 
       case 2: 
        NewMonth = "February"; 
        break; 
       case 3: 
        NewMonth = "March"; 
        break; 
       case 4: 
        NewMonth = "April"; 
        break; 
       case 5: 
        NewMonth = "May"; 
        break; 
       case 6: 
        NewMonth = "June"; 
        break; 
       case 7: 
        NewMonth = "July"; 
        break; 
       case 8: 
        NewMonth = "August"; 
        break; 
       case 9: 
        NewMonth = "September"; 
        break; 
       case 10: 
        NewMonth = "October"; 
        break; 
       case 11: 
        NewMonth = "November"; 
        break; 
       case 12: 
        NewMonth = "December"; 
        break; 
      } 

      return NewMonth; 
     } 

//QuickSort for double data values are in ascending order. 
public static void QuickSort(double[] data) 
{ 
Quick_Sort(data, 0, data.Length - 1); 
} 
public static void Quick_Sort(double[] data, int left, int right) 
{ 
int i, j; 
double pivot, temp; 
i = left; 
j = right; 
pivot = data[(left + right)/2]; 
do 
{ 
while ((data[i] < pivot) && (i < right)) i++; 
while ((pivot < data[j]) && (j > left)) j--; 
if (i <= j) 
{ 
temp = data[i]; 
data[i] = data[j]; 
data[j] = temp; 
i++; 
j--; 
} 
} while (i <= j); 
if (left < j) Quick_Sort(data, left, j); 
if (i < right) Quick_Sort(data, i, right); 
}   
} 

Antwort

1

Ein DateTime Objekt Month Eigenschaft gibt Ihnen den ganzzahligen Wert des Monats, beginnend bei 1 wie Sie benötigen. So Sie DateTime.ParseExact() zu analysieren, um die Zeichenfolge in eine volle DateTime Objekt dann greifen die Month Eigenschaft verwenden:

int monthNumber = DateTime.ParseExact("January", "MMMM", CultureInfo.CurrentCulture).Month; 

Sie müssen nur mit Ihrem Monat Strings ersetzen "January", und lassen Sie "MMMM" welche die Custom Format String für „Der vollständige Name ist des Monats".

die alle oben genannten Code tut, ist Ihr MonthToDouble() Verfahren vereinfachen, die Sie nicht einmal aus irgendeinem Grund verwenden (auch sollte es eine double zurückkehren, kein int). Im Gegensatz zu Ihrem Titel haben Sie bereits eine Methode, um "Monate in Zahlen umzurechnen" umzuwandeln, Sie verwenden sie einfach nicht.

Also, ich nehme an, das einzige, was Sie fehlen, dies zu ersetzen:

Array.Copy(Month,data,1022); 
    QuickSort(data); 

mit diesem:

 double[] monthsAsDoubles = new double[Month.Length]; 
     for (int i = 0; i < monthsAsDoubles.Length; i++) 
     { 
      monthsAsDoubles[i] = MonthToDouble(Month[i]); 
     } 
     QuickSort(monthsAsDoubles); 

auch den Rückgabewert ändern von MonthToDouble() von int zu double (Guss wenn du brauchst).

+0

Wie würde ich Januar mit meinem Monat Saiten ersetzen? Sie sind in einem Array und es gibt viel zu viele, um manuell zu schreiben. – ConfusedProgrammer

+0

@ConfusedProgrammer siehe meine Bearbeitung. Warum haben Sie eine 'MonthToDouble()' Methode erstellt und niemals benutzt? – Quantic

0

Bearbeiten: Auf den zweiten Gedanken, Quantic's Antwort ist einfacher. Ich überlasse das hier als Alternative.


Der Code kann unter Verwendung des DateTimeFormatInfo.MonthNames Eigenschaft, zusammen mit Groß- und Kleinschreibung String-Vergleich viel vereinfacht werden. Dies hat auch den Vorteil, dass es einfacher ist, verschiedene Sprachen für die Monatsnamen zu portieren. Hier

ist ein Ausschnitt:

using System; 
using System.Globalization; 
using System.Linq; 
using System.Collections.Generic; 

public class Test 
{ 
    public static void Main() 
    { 

     var InputMonths = new List<string> { "January","march","sepTEmber","smarch" }; 

     var MonthNames = new DateTimeFormatInfo().MonthNames.ToList(); 

     var InputMonthNumbers = new List<int>(); 

     foreach (var m in InputMonths) 
     { 
      //Find index of the month name, ignoring case 
      //Note if the input month name is invalid, FindIndex will return 0 
      int month_num = 1 + MonthNames.FindIndex(name => name.Equals(m, StringComparison.OrdinalIgnoreCase)); 

      if (month_num > 0) 
      { 
       InputMonthNumbers.Add(month_num); 
      } 
     } 

     foreach (var n in InputMonthNumbers) 
     { 
      Console.WriteLine(n.ToString()); 
     } 

    } 
} 

Ausgabe:

1 
3 
9 
+0

Ich kann sehen, der Code funktioniert, aber ich brauche die Ausgabe in ein Doppel-oder int-Array geschrieben werden, die dann durch Quicksort gestellt werden kann. – ConfusedProgrammer