两个二维数组的匹配方法

Posted by 蒋波涛 29 December,2007 Views (0)Comment

问题:如何对两个二维多列数组进行匹配运算,将两个数组中一致的元素设置标记。

int[,] a = new int[5, 3];    int[,] b = new int[5, 3];
a[0, 0] = 3;                       b[0, 0] = 1;
a[0, 1] = 8;                      b[0, 1] = 0;
a[1, 0] = 7;                       b[1, 0] = 3;
a[1, 1] = 2;                       b[1, 1] = 8;
a[2, 0] = 6;                       b[2, 0] = 2;
a[2, 1] = 4;                       b[2, 1] = 4;
a[3, 0] = 5;                       b[3, 0] = 5;
a[3, 1] = 9;                       b[3, 1] = 9;
a[4, 0] = 3;                      b[4, 0] = 7;
a[4, 1] = 5;                      b[4, 1] = 7;

将a和b的重复元素第三项设置为1的标记。

解决方法:

1.将两个数组分别进行排序,一个数组的排序也要对其两个项都实施。
对第一个字段进行排序的函数sort
private static void sort(ref int[,] X)
{
    int tmpx;
    int tmpy;
    for (int i = 0; i < X.Length / 3 - 1; i++)
    {
        for (int j = i + 1; j < X.Length / 3; j++)
        {
            if (X[i, 0] > X[j, 0])
            {
                tmpx = X[i, 0];
                tmpy = X[i, 1];
                X[i, 0] = X[j, 0];
                X[i, 1] = X[j, 1];
                X[j, 0] = tmpx;
                X[j, 1] = tmpy;
            }
        }
    }
}
对第二个字段排序的函数sort2:
private static void sort2(ref int[,] X)
{
    int tmpx;
    int tmpy;
    for (int i = 0; i < X.Length / 3 - 1; i++)
    {
        for (int j = i + 1; j < X.Length / 3; j++)
        {
            if (X[i, 0] == X[j, 0] && X[i, 1] > X[j, 1])
            {
                tmpx = X[i, 0];
                tmpy = X[i, 1];
                X[i, 0] = X[j, 0];
                X[i, 1] = X[j, 1];
                X[j, 0] = tmpx;
                X[j, 1] = tmpy;
            }
        }
    }
}

经过此排列的a数组为:

a[0, 0] = 3;
a[0, 1] = 5;
a[1, 0] = 3;
a[1, 1] = 8;
a[2, 0] = 5;
a[2, 1] = 9;
a[3, 0] = 6;
a[3, 1] = 4;
a[4, 0] = 7;
a[4, 1] = 2;

b数组为:

b[0, 0] = 1;
b[0, 1] = 0;
b[1, 0] = 2;
b[1, 1] = 4;
b[2, 0] = 3;
b[2, 1] = 8;
b[3, 0] = 5;
b[3, 1] = 9;
b[4, 0] = 7;
b[4, 1] = 7;

我们可以看到,{3,8,0}和{5,9,0}都是重复项。如何最快将其比对呢?其比对函数如下:

        private static void Compare2(int[,] X, int[,] Y)
        {
            int startpos = 0;
            for (int i = 0; i < X.Length / 3; i++)
            {
                for (int j = startpos; j < Y.Length / 3; j++)
                {
                    if (X[i, 0] < Y[j, 0])
                    {
                        Console.WriteLine("-");
                        startpos=j;
                        break;
                    }
                    else if (X[i, 0] == Y[j, 0])
                    {
                        if (X[i, 1] == Y[j, 1])
                        {
                            X[i, 2] = 1;
                            Y[j, 2] = 1;
                            Console.WriteLine("-");
                            startpos = j + 1;
                            break;
                        }
                        else if (X[i, 1] < Y[j, 1])
                        {
                            Console.WriteLine("-");
                            startpos = j ;
                            break;
                        }
                    }
                }
            }
        }

 

Related Items

Categories : .NET开发 Tags : NET  
Comments
Leave a comment

Or, take a look at Archives and Categories

目录

存档