2016-07-22 11 views
0

私は外部テキストファイルから配列を読み込み、その月を等価の値を保持する配列に変換する必要があります。 1月= 1月、2月= 2など。そのため、クイックソートを通過させることができます。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); 
}   
} 

答えて

1

DateTimeオブジェクトのMonthプロパティは、あなたが必要のように1から始まる月の整数値を与えます。だから、その後、MonthプロパティをつかむフルDateTimeオブジェクトに文字列を解析するためにDateTime.ParseExact()を使用することができます。

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

あなたはちょうどあなたの月の文字列で"January"を交換し、フルネーム」のCustom Format Stringである"MMMM"を残しておく必要があります今月の"。

上記のコードはすべて、MonthToDouble()メソッドを簡略化しています。何らかの理由で使用していない(intではなくdoubleも返さなければなりません)。あなたのタイトルに反して、あなたはすでに「月を同等の数に変換する」という方法を持っています。これにより

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

だから、私はあなたが不足している唯一のものは、これを交換することであると仮定し

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

はまた、(あればキャストdoubleintからMonthToDouble()の戻り値を変更します必要がある)。

+0

私は私の月の文字列で月を置き換えるだろうか?彼らは配列の中にあり、手作業で多くを書く方法があります。 – ConfusedProgrammer

+0

@ConfusedProgrammerは私の編集を参照してください。なぜあなたは 'MonthToDouble()'メソッドを作り、それを使わなかったのですか? – Quantic

0

編集:第2の考えでは、クワンティックの答えは簡単です。私は代わりとしてこれをここに残しておきます。


あなたのコードでは、大文字と小文字を区別しない文字列比較とともに、DateTimeFormatInfo.MonthNamesプロパティを使用して多くのことを簡素化することができます。これには、月名に異なる言語を使用する方がはるかに簡単であるという利点もあります。ここで

は抜粋です:

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

    } 
} 

出力:

1 
3 
9 
+0

私はコードの動作を見ることができますが、Quicksortを介して入力できるdoubleまたはint配列に出力を書き出す必要があります。 – ConfusedProgrammer

関連する問題