将月份转换为在快速排序中使用的等效数字

本文关键字:数字 快速排序 转换 | 更新日期: 2023-09-27 17:58:13

我从外部文本文件中读取了一些月份到数组中,我需要将这些月份转换为一个数组,该数组包含与月份等效的值,例如January=1、February=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);
 }          
}

将月份转换为在快速排序中使用的等效数字

DateTime对象的Month属性为您提供从1开始的月份的整数值,如您所需。因此,您可以使用DateTime.ParseExact()将字符串解析为完整的DateTime对象,然后获取Month属性:

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

您只需要将"January"替换为月份字符串,并保留"MMMM",即"月份的全名"的Custom Format String

以上代码所做的只是简化您的MonthToDouble()方法,由于某些原因您甚至没有使用该方法(而且它应该返回double,而不是int)。与你的标题相反,你已经有了一种"将月份转换为数字当量"的方法,你只是没有使用它。

所以,我想你唯一缺少的就是替换这个:

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

还要将MonthToDouble()的返回值从int更改为double(如果需要,请强制转换)。

编辑:仔细想想,Quantic的答案更简单。我将把这个留在这里作为一个替代方案。


通过使用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