C#中两个int数组的交集

时间:2013-12-19 16:54:21

标签: c#

我试图找到两个int数组的交集。我正在使用此代码:

  public int[] Find_Common_Elements(int[] p1, int[] p2)
    {
        int count = 0;
        for (int i = 0; i < p1.Length; i++)
        {
            for (int j = 0; j < p2.Length; j++)
            {
                if (p1[i] == p2[j])
                {
                    count++;
                    break;
                }
            }
        }

        int[] result = new int[count];
        count = 0;
        for (int i = 0; i < p1.Length; i++)
        {
            for (int j = 0; j < p2.Length; j++)
            {
                if (p1[i] == p2[j])
                {
                    result[count++] = p1[i];
                    break;
                }
            }
        }

        return result;
    }

    public int[] BubbleSort(int[] numarray)
    {
        int max = numarray.Length;
        for (int i = 1; i < max; i++)
        {
            for (int j = 0; j < max - i; j++)
            {

                if (numarray[j] > numarray[j + 1])
                {
                    int temp = numarray[j];
                    numarray[j] = numarray[j + 1];
                    numarray[j + 1] = temp;
                }
            }
        }
        return numarray;
    }

    public int[] Find_Unique_Elements(int[] numarray)
    {
        BubbleSort(numarray);
        int element = numarray[0];
        int count = 1;
        for (int i = 1; i < numarray.Length; i++)
        {
            if (element == numarray[i])
                continue;
            else
            {
                element = numarray[i];
                count++;
            }
        }

        int[] result = new int[count];

        count = 0;
        element = numarray[0];
        result[count++] = element;
        for (int i = 1; i < numarray.Length; i++)
        {
            if (element == numarray[i])
                continue;
            else
            {
                element = numarray[i];
                result[count++] = element;
            }
        }
        return result;
    }

    public void Result()
    {
        int[] array1 = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
             95, 85, 75, 65, 55, 45, 35, 25, 15, 05,
             10, 15, 20, 25, 30, 35, 40, 45, 50, 55
        };

        int[] array2 = new int[] { 15, 25, 35, 45, 55,
             12, 22, 32, 43, 52,
             15, 25, 35, 45, 55
        };

        int[] p1 = Find_Unique_Elements(array1);
        int[] p2 = Find_Unique_Elements(array2);
        int[] result = Find_Common_Elements(array1, array2);

        for (int i = 0; i < p1.Length; i++)
            textBox1.Text += "\n" + p1[i].ToString();
        for (int i = 0; i < p2.Length; i++)
            textBox2.Text += "\n" + p2[i].ToString();
        for (int i = 0; i < result.Length; i++)
            textBox3.Text += "\n"+result[i].ToString();
        }








    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Result();
    }

但问题是,获得的结果是15 15 25 25 35 35 45 45 55 55,我想要15 25 35 45 55.这段代码有什么问题?   谢谢你的帮助

4 个答案:

答案 0 :(得分:14)

您可以使用内置的Linq Intersect扩展方法:

using System.Linq; // Make sure you include this line

public int[] Find_Common_Elements(int[] p1, int[] p2)
{
    return p1.Intersect(p2).ToArray();
}

答案 1 :(得分:3)

如果你想在学术上解决问题,即不使用内置方法,那么这里有两个解决方案:

  1. 对两个数组进行排序。然后通过它们进行传递,类似于Merge sort并打印出相同的元素。

  2. 在一个数组中查找一个数据透视表(例如,使用Median of Medians算法)。然后围绕该枢轴划分每个阵列。然后打印出两个数组中共同的枢轴值(通过这样做,你已经解决了枢轴元素的交叉点)。然后以递归方式重复左侧分区和两个阵列右侧分区上的操作。

  3. 编辑:从纯粹算法的角度来看,我对这个问题感到困惑。解决方案#2是一种优化的就地交叉算法,但由于较小的常数因子,#1的工作速度更快。我已经记录了差异和推理为什么排序在一篇文章中更有效率,这篇文章有点太长了:Finding Intersection of Two Unsorted Arrays

答案 2 :(得分:1)

Linq绝对是最干净的方法,但这并不意味着你应该抛弃你的代码。这是一个很好的学习工具来质疑“为什么这段代码不能做同样的事情?”

答案非常简单。您没有将唯一数组传递到Find_Common_Elements! (Find_Common_Elements有一个内置的假设,即输入具有唯一元素,否则行为将如预期的那样。)只需更改此

    int[] result = Find_Common_Elements(array1, array2);

到此:

    int[] result = Find_Common_Elements(p1, p2);

会让您的代码完美运行。

答案 3 :(得分:0)

 static void Main(string[] args)
    {
        int[] one= { 1, 3, 4, 6, 7 };
        int[] second = { 1, 2, 4, 5 };

        foreach (int r in one.Intersect(second))
            Console.WriteLine(r);
        Console.ReadLine();
    }

享受