我试图在三个数组中找到共同元素。我正在使用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是唯一在这种情况下常见的元素时停止查看。请帮忙。
答案 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。
中的扩展方法 Intersectvar 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);
}
}