简体   繁体   中英

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

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 :

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. And it will not really help you learning Sorting in .NET anyway.

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 . That way you can provide a custom sorting order.

If the class implements IComparable , that implementation becomes the "default comparer". It is automatically used by Sort() if you do not provide another one.

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.

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

And then there is stuff like normalisation to consider too. Because some unicode characters can have multiple char/binary representations.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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