如何比较锯齿状数组中的元素?

时间:2018-02-03 17:30:16

标签: c# arrays sorting

我正在尝试制作排序方法(我知道它存在但是为了更好地理解编程我想自己做)。 我试图使用锯齿状数组,因为如果我有一个名字约翰和另一个名称阿尔伯特所以每个名称有不同的长度,我想将名称上的每个字母转换为一个整数(我创建方法ConvertChartoInt来做到这一点),然后存储它在数组中 让我们假设我有一个有3个名字的数组:John,Albert,Bryan 我正在将John,Albert,Bryan的所有字母转换为整数,并将它们放在一个锯齿状的数组中

int[][] elements = new int[array.Length][];

for (int i=0;i<array.Length;i++)
{
    elements[i] = new int[array[i].Length];
    for (int j=0;j<array[i].Length;j++)
    {
        g = ConvertChartoInt(array[i][j]);

        elements[i][j] = g;
    }

}

现在我将每个名字的所有数字都放在一个锯齿状的数组中,我想首先比较它们,我想比较第一列:

string name = "";
for (int i = 0; i < elements.GetLength(0); i++)
    {

    int[] temp = new int[elements[i].Length];
    for (int j = 0; j < elements.GetLength(0); j++)
    {
        if (elements[j][i] < elements[i][i])
        {
            temp = elements[i];
            elements[i] = elements[j];
            elements[j] = temp;
            name = array[i];
            array[i] = array[j];
            array[j] = name;
        }
    }
}

我知道这不正确,但我不知道如何做到这一点 我想首先比较第一列的元素,如果第二行的第一个元素小,那么整个数组将到达该位置 前一个,但如果他们是相等的,那么我想检查第二个元素(我开始i = 0和j = i + 1,这工作正常,直到i = 1,它将从低到高存储我的阵列,但只是为了第一个元素,因为i ++我得索引超出界限,我知道这不是我想做的事情) 这是完整的代码:

namespace ConsoleApp2
{
    class Program
    {
        static int ConvertChartoInt(char x)
        {
            int number = 0;
            switch (x)
            {
                case 'A':
                    number = 0;
                    break;
                case 'B':
                    number = 1;
                    break;
                case 'C':
                    number = 2;
                    break;
                case 'D':
                    number = 4;
                    break;
                case 'E':
                    number = 5;
                    break;
                case 'F':
                    number = 6;
                    break;
                case 'G':
                    number = 7;
                    break;
                case 'H':
                    number = 8;
                    break;
                case 'I':
                    number = 9;
                    break;
                case 'J':
                    number = 10;
                    break;
                case 'K':
                    number = 11;
                    break;
                case 'L':
                    number = 12;
                    break;
                case 'M':
                    number = 13;
                    break;
                case 'N':
                    number = 14;
                    break;
                case 'O':
                    number = 15;
                    break;
                case 'P':
                    number = 16;
                    break;
                case 'Q':
                    number = 17;
                    break;
                case 'R':
                    number = 18;
                    break;
                case 'S':
                    number = 19;
                    break;
                case 'T':
                    number = 20;
                    break;
                case 'U':
                    number = 21;
                    break;
                case 'V':
                    number = 22;
                    break;
                case 'X':
                    number = 23;
                    break;
                case 'Y':
                    number = 24;
                    break;
                case 'Z':
                    number = 25;
                    break;
                case 'a':
                    number = 0;
                    break;
                case 'b':
                    number = 1;
                    break;
                case 'c':
                    number = 2;
                    break;
                case 'd':
                    number = 4;
                    break;
                case 'e':
                    number = 5;
                    break;
                case 'f':
                    number = 6;
                    break;
                case 'g':
                    number = 7;
                    break;
                case 'h':
                    number = 8;
                    break;
                case 'i':
                    number = 9;
                    break;
                case 'j':
                    number = 10;
                    break;
                case 'k':
                    number = 11;
                    break;
                case 'l':
                    number = 12;
                    break;
                case 'm':
                    number = 13;
                    break;
                case 'n':
                    number = 14;
                    break;
                case 'o':
                    number = 15;
                    break;
                case 'p':
                    number = 16;
                    break;
                case 'q':
                    number = 17;
                    break;
                case 'r':
                    number = 18;
                    break;
                case 's':
                    number = 19;
                    break;
                case 't':
                    number = 20;
                    break;
                case 'u':
                    number = 21;
                    break;
                case 'v':
                    number = 22;
                    break;
                case 'x':
                    number = 23;
                    break;
                case 'y':
                    number = 24;
                    break;
                case 'z':
                    number = 25;
                    break;
                default:
                    Console.WriteLine("Unknown character!!");
                    break;

            }
            return number;
        }

        static string[] SortArray( string[] array)
        {
            int[][] elements = new int[array.Length][];
            int g = 0;

            for (int i=0;i<array.Length;i++)
            {
                elements[i] = new int[array[i].Length];
                for (int j=0;j<array[i].Length;j++)
                {
                    g = ConvertChartoInt(array[i][j]);

                    elements[i][j] = g;
                }
            }


            string name = "";
            for (int i = 0; i < elements.GetLength(0); i++)
            {
                int[] temp = new int[elements[i].Length];
                for (int j = 0; j < elements.GetLength(0); j++)
                {
                    if (elements[j][i] < elements[i][i])
                    {
                        temp = elements[i];
                        elements[i] = elements[j];
                        elements[j] = temp;
                        name = array[i];
                        array[i] = array[j];
                        array[j] = name;
                    }
                }
            }

            return array;
        }

        static void Main(string[] args)
        {
            string[] names = { "John","Tom","Albert","Richard","Bryan" };
            SortArray( names);
            foreach (string el in names)
                Console.Write(el + " ");
            Console.ReadKey();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

将string []数组转换为锯齿状的char [] []数组似乎过多了。无论如何,它无助于你学习.NET中的排序。

通常你只是提供一个Comparer,告诉你两个实例是否有更多,更少或相等。有两种方法:

调用接受IComparer instance的Array.Sort()重载之一。这样您就可以提供自定义排序顺序。

如果类实现IComparable,那么该实现将成为&#34;默认比较器&#34;。如果您不提供另一个,则Sort()会自动使用它。

两者都有一个共同点,就是它们有一个返回整数的函数,告诉你这两个实例是否更多,更少或者相等。

在这两个函数中的任何一个中,您可以将任一字符串转换为char []数组以进行比较。

我还必须指出字符串与普通类相反。 Equality检查进行值比较。 String Internning也没有帮助。平等和字符串是奇怪的:http://www.codeproject.com/Articles/18714/Comparing-Values-for-Equality-in-NET-Identity-and

然后还有像normalisation这样的东西。因为一些unicode字符可以有多个char / binary表示。