将一个数组的序列代入另一个数组
本文关键字:数组 代入 另一个 一个 | 更新日期: 2023-09-27 17:50:10
我有两个数组对象
int[] arr1= new int[] {1,2,5,6,7,9,3,5,6,7}
int[] arr2 = new int[] {5,6,7}
现在,如何在arr1中找到arr2的出现次数?
也许不是很优雅,但它应该可以工作。这选择a
中具有与b
相同长度的所有子阵列,并检查有多少子阵列等于b
。
int[] a = {1, 2, 3, 4, 5};
int[] b = {2, 3};
int count = 0;
int bl = b.Length;
for (int i = 0; i <= a.Length - bl; i++)
{
var suba = a.Skip(i).Take(bl);
if (suba.SequenceEqual(b))
count++;
}
注意:此解决方案考虑了重叠的子阵列,因此如果a = {2, 2, 2}
和b = {2, 2}
,则计数为2
。
您可以使用arr2.Intersect(arr1).Count()
因此,在您的情况下,它将返回3
,因为arr2
中的3个元素存在于arr1
中。
如果这不是你想要的,请澄清。
使用intersect。这个代码片段将解决您的问题并打印所有重复项,并显示arr1中每个重复项的计数。请注意,我还使用了LinqDistinct((,因此在循环常见事件时,我只检查一次,而不是多次。
int[]arr1=新int[]{1,2,5,6,7,9,3,5,6,7};int[]arr2=新int[]{5,6,7};var listCommon=arr1.AsEnumerable((。其中(arr2.AsEnumerale((.Contains(;foreach(listCommon.Distinct((中的var x({var numberOfOccurrencesInAr1=arr1.Where(y=>y==x(.Count((;Console.WriteLine(x+"为:"+numberOfOccurrencesInArr1.ToString((+"arr1中的次数"(;}Console.ReadLine((;
有关详细信息,请参阅MSDN;http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect(v=vs.110(.aspx
listCommon将是两个数组中的公共项数。
试试这个
string result = string.Empty; ;
int[] arr1 = new int[] { 1, 2, 5, 6, 7, 9, 3, 5, 6, 7 };
int[] arr2 = new int[] { 5, 6, 7 };
int count = arr2.Intersect(arr1).Count();
if (count == arr2.Length)
{
result = "Found";
}
else
{
result = "Not Found";
}
如果你想计算第二个数组的整数在第一个数组中出现的次数,那么你可以写
int[] arr1 = new int[] {1,2,5,6,7,9,3,5,6,7};
int[] arr2 = new int[] {5,6,7};
Dictionary<int, int> counter = new Dictionary<int, int>();
foreach(int x in arr1)
{
if(arr2.Contains(x))
{
if(counter.ContainsKey(x))
counter[x]++;
else
counter[x] = 1;
}
}
foreach(KeyValuePair<int, int> kvp in counter)
Console.WriteLine("Key=" + kvp.Key.ToString() + " is present " + kvp.Value.ToString() + " times");
int[] arr1 = new int[] { 1, 2, 5, 6, 7, 9, 3, 5, 6, 7 };
int[] arr2 = new int[] { 5, 6, 7 };
如何在arr1中找到arr2的出现次数
如果您期望的结果是2
。由于5、6、7在arr1 中出现两次
试试这个
var res = arr1.Where(x => arr2.Contains(x)).Count()/arr2.Count();
试试这个:
var results = (from a1 in arr1
join a2 in arr2
on a1 equals a2
group arr1 by a1 into Group
select new
{
Number = Group.Key,
Times = Group.Count()
});
foreach(var result in results)
Console.WriteLine(result.Number+" "+result.Times);
请使用以下fiddle.NET fiddle 检查此解决方案
您可以在第一个计数中的int
s上使用ToLookup
,该计数也在第二个数组中。然后你只需要取所有组的最小计数,因为这是最大的交集:
var subsetGroups = arr1.Where(i1 => arr2.Contains(i1)).ToLookup(i => i);
int minGroupCount = 0;
// check if all integers from the array are in the first at all
if(arr2.All(i => subsetGroups.Contains(i)))
{
minGroupCount = subsetGroups.Min(g => g.Count()); // 2
}
请注意,这种方法不关心顺序,也不关心第二个数组中重复的数量。这可能是想要的,也可能不是。
当您输入is数组时,您可以使用索引来有效地计算子数组在主数组中的出现次数:
var count = 0;
for (var i = 0; i < arr1.Length - arr2.Length + 1; i += 1) {
if (arr1[i] != arr2[0])
continue;
var isSubarray = true;
for (var j = 0; j < arr2.Length; ++j)
if (arr1[i + j] != arr2[j]) {
isSubarray = false;
break;
}
if (isSubarray)
count += 1;
}
结果将是2,因为567在1256793567中被找到两次。
如果子阵列本身可以"重叠"(例如111中的11(,则所有"重叠"都将被计数(例如,本例的结果为2(。如果不是这样的话,您只需在主循环结束时提前索引i
,就可以跳过找到的子数组。