【问题标题】:How do I compare elements in a jagged array?如何比较锯齿状数组中的元素?
【发布时间】:2018-02-03 17:30:15
【问题描述】:

我正在尝试制作一种排序方法(我知道它存在,但为了更好地理解编程,我想自己做)。 我正在尝试使用锯齿状数组,因为如果我有一个名字 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;
    }

}

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

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

【问题讨论】:

  • 在锯齿状 CHAR[][] 数组中转换字符串似乎过度。通常,您真正需要做的就是提供一个自定义比较器。
  • 我将字符串 [] 数组转换为锯齿状数组而不是字符串变量

标签: c# arrays sorting


【解决方案1】:

将 string[] 数组转换为锯齿状 char[][] 数组似乎有些过分。无论如何,它不会真正帮助您学习 .NET 中的排序。

通常你只需要提供一个比较器来判断任何两个实例是否大于、小于或等于另一个。有两种方法:

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

如果类实现IComparable,则该实现成为“默认比较器”。如果您不提供另一个,Sort() 会自动使用它。

两者的共同点是它们都有一个返回整数的函数,告诉您两个实例是多、少还是彼此相等。

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

我还必须指出,字符串与普通类相反。相等检查进行值比较。字符串实习也无济于事。相等和字符串是奇数:http://www.codeproject.com/Articles/18714/Comparing-Values-for-Equality-in-NET-Identity-and

还有像normalisation 这样的东西也需要考虑。因为一些 unicode 字符可以有多种 char/binary 表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2017-04-19
    • 2019-06-26
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多