简体   繁体   English

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

[英]How do I compare elements in a jagged array?

I am trying to make a sort method ( I know it exists but to understand programming better I want to do it myself ) . 我正在尝试创建一种排序方法(我知道它存在,但是为了更好地理解编程,我想自己做)。 I am trying to use jagged array because if I have a name John and another name Albert so each name has different length and I want to convert each letter on the name to an integer ( I created method ConvertChartoInt to do that ) and then store it in an array Lets assume I have an array with 3 names : John, Albert , Bryan I am converting all letters for John , Albert , Bryan to an integer an placing them in a jagged array 我尝试使用锯齿状数组,因为如果我有一个名字John和另一个名字Albert,那么每个名字都有不同的长度,并且我想将名字上的每个字母都转换成整数(我创建了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;
    }

}

Now that I placed all numbers for each name in a jagged array I want to compare them first of all I want to compare just the first column : 现在,我将每个名称的所有数字都放在锯齿状的数组中,我想首先比较它们,我只想比较第一列:

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 know this is not correct but I don't know here how to do it 我知道这是不正确的,但我不知道该怎么做
I want to compare first just the elements of the first column and if the first element of the second row is smaller then the whole array will get in the place of the previous one but if they are equal then I want to check the second element ( where I start i=0 and j=i+1 this works fine til i=1 it will store my arrays fine from lower to higher but just for the first element and because i ++ I get index out of bound and I know it is not exactly what I want to do ) Here is the whole code : 我想先比较第一列的元素,如果第二行的第一个元素较小,则整个数组将代替上一个元素,但是如果它们相等,则我要检查第二个元素(我从i = 0和j = i + 1开始,直到i = 1,它将从低到高存储我的数组,但仅对第一个元素有效,因为我++使索引超出范围,所以我知道并不是我想做的)这是完整的代码:

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

Turning a string[] array into a jagged char[][] array seems excessive. 将string []数组转换为锯齿char [] []数组似乎是多余的。 And it will not really help you learning Sorting in .NET anyway. 无论如何,它并不会真正帮助您学习.NET中的排序。

Usuall you just provide a Comparer that tells if any two instance are more, less or equal to one another. 通常,您只需要提供一个比较器,即可判断两个实例之间是大于,小于还是相等。 There are two ways for that: 有两种方法:

Call one of the overloads of Array.Sort() that accept a IComparer instance . 调用Array.Sort()的重载之一,该重载接受IComparer实例 That way you can provide a custom sorting order. 这样,您可以提供自定义的排序顺序。

If the class implements IComparable , that implementation becomes the "default comparer". 如果该类实现IComparable ,则该实现将成为“默认比较器”。 It is automatically used by Sort() if you do not provide another one. 如果您不提供另一个,则由Sort()自动使用。

Both have in common that they have one function that returns a integer, telling you if the two instances are more, less or equal to one another. 两者的共同点是它们都有一个返回整数的函数,告诉您两个实例彼此之间是多还是少或相等。

Within either of those two functions you can turn either string into a char[] array to do the comparision on. 在这两个函数中的任何一个中,您都可以将任意一个字符串转换为char []数组以进行比较。

I also have to point out that string is the opposite of a normal class. 我还必须指出,字符串与普通类相反。 The Equality check does a value comparision. 相等检查会进行值比较。 String Internning does not help either. 字符串实习也无济于事。 Equality and strings is odd: http://www.codeproject.com/Articles/18714/Comparing-Values-for-Equality-in-NET-Identity-and 平等和字符串是奇怪的: http : //www.codeproject.com/Articles/18714/Comparing-Values-for-Equality-in-NET-Identity-and

And then there is stuff like normalisation to consider too. 然后还有诸如标准化之类的东西也要考虑。 Because some unicode characters can have multiple char/binary representations. 因为某些Unicode字符可以具有多个char / binary表示形式。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM