使用foreach和hashtable查找三个数组中的公共元素

时间:2013-12-17 06:11:19

标签: c# arrays

我试图在三个数组中找到共同元素。我正在使用Hashtable这个目的,因为很多人在这里建议它给O(n)和它更好。 这是我试过的代码..

    using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class newAttempt
    {
        static void Main()
        {
            Hashtable hm = new Hashtable();
            int[] a = new int[] { 1, 2, 3, 4, 5 };
            int[] b = new int[] { 2, 4, 6, 7, 8 };
            int[] c = new int[] { 3, 4, 5, 6, 9 };
            for (int i = 0; i <= a.Length - 1; i++)
            {
                hm.Add(i, a[i]);
            }

            foreach(int k in b)
                if (hm.Contains(k))
                {
                    foreach (int j in c)
                        if (hm.Contains(j))
                            Console.WriteLine(j);
                }


          Console.ReadKey();
        }
    }
}

我得到了ouput 3 4 3 4

我希望我的程序在发现4是唯一在这种情况下常见的元素时停止查看。请帮忙。

7 个答案:

答案 0 :(得分:3)

使用list.Intersect函数,这是示例。

var list1 = new string[] {"4", "5", "6", "7", "8"};
var list2 = new string[] {"4", "5"};
var commonElement = list1.Intersect(list2);
foreach (string s in commonElement ) Console.WriteLine(s);

输出:

4
5

欲了解更多信息,

This是交集或数组的示例!

答案 1 :(得分:1)

您没有检查内部编号是否与外部循环编号相同,因此基本上您在hm中的b和c中打印所有编号。用以下内容替换你的内循环:

 foreach (int j in c)
   if (j==k) // hm.Contains(j) is covered by the previous hm.Contains(k)
     Console.WriteLine(j);

编辑:对于C#,另一个答案的交叉方法更可取。或者,您可以在执行此操作之前将数组转换为Set,以提高较长序列的性能。

答案 2 :(得分:1)

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

 var result = a.Intersect(b).Intersect(c).ToArray(); // 4

答案 3 :(得分:1)

您可以使用linq。

中的扩展方法 Intersect
var hm1 = new HashSet<int>(new[] {1, 2, 3, 4, 5});
var hm2 = new HashSet<int>(new[] { 2, 4, 6, 7, 8 });
var hm3 = new HashSet<int>(new[] { 3, 4, 5, 6, 9 });

var intersection = hm1.Intersect(hm2).Intersect(hm3);

foreach (var i in intersection)
{
    Console.WriteLine(i);
}

答案 4 :(得分:0)

尝试将代码更改为

foreach (int k in b)
    if (hm.Contains(k))
    {
        foreach (int j in c)
            if (j == k && hm.Contains(j)) //changes here
                Console.WriteLine(j);
    }

如果您希望在找到匹配项后退出for循环,可以尝试类似

的内容
bool found = false;
for (int bIndex = 0; !found && bIndex < b.Length; bIndex++)
{
    int k = b[bIndex];
    if (hm.Contains(k))
    {
        for (int cIndex = 0; !found && cIndex < c.Length; cIndex++)
        {
            int j = c[cIndex];
            if (j == k && hm.Contains(j))
            {
                Console.WriteLine(j);
                found = true;
            }
        }
    }
}

答案 5 :(得分:0)

在你的代码中,你正在用第二个数组检查第一个数组。如果匹配那么第一个数组用第三个数组。 但我们需要的是,如果第一个数组有一个匹配的母鸡,我们要检查该值是否存在于第三个数组中。只有该特定值。 但是你用第三个数组检查第一个数组的整个值

 public  static void main(String args[])
        {
            Hashtable hm = new Hashtable();

            int[] a = new int[] { 1, 2, 3, 4, 5 };
            Integer[] b = new Integer[]{ 2, 4, 6, 7, 8 };
            int[] c = new int[] { 3, 4, 5, 6, 9 };
            for (int i = 0; i <= a.length - 1; i++)
            {
                hm.put(i,a[i]);
            }
         for(int k:b)
         {
             if (hm.contains(k))
                {
                   for(int j:c)
                   {
                        if (k==j)  //here is the change
                        {
                            System.out.print(j);
                        }
                   }
                }
         }

        }
    }

答案 6 :(得分:0)

您可以使用Linq。相交方法将有利于此目的。 但是,你想找到只使用循环和Hashtable的交叉点吗?

此代码应该有效:

        Hashtable hm = new Hashtable();
        int[] a = new int[] { 1, 2, 3, 4, 5 };
        int[] b = new int[] { 2, 4, 6, 7, 8 };
        int[] c = new int[] { 3, 4, 5, 6, 9 };            

        foreach (var iA in a)
        {
            foreach (var iB in b)
            {
                if (iA == iB && !hm.ContainsKey(iA))
                {
                    hm.Add(iA, iA);
                }
            }
        }

        foreach (var iC in c)
        {
            if (hm.ContainsKey(iC))
            {
                Console.WriteLine(iC);
                hm.Remove(iC);
            }
        }