2014-03-14 150 views
1

我有兩個數組對象要找到一個陣列的序列到另一個陣列

int[] arr1= new int[] {1,2,5,6,7,9,3,5,6,7} 
int[] arr2 = new int[] {5,6,7} 

現在,如何找到在ARR1 ARR2的出現的沒有?

+0

你想要計算第一個數組中有多少個5,6,7,或者你想要一個只有兩個數組中存在數字的數組? – Steve

+4

您的問題需要更精確的規格。 'arr1 = {1,1,1,1}','arr2 = {1,1}'應該返回什麼? 2或3? – Heinzi

+0

您好史提夫,爲了澄清輸出,它必須返回計數爲2,因爲序列{5,6,7}在arr1中發生兩次。 – user3419159

回答

1

也許不是很優雅,但它應該工作。 這將選擇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++; 
} 

N.B .:此溶液考慮重疊的子陣列,因而如果a = {2, 2, 2}b = {2, 2},計數將是2

+0

謝謝埃尼尼奧。這工作正常。 – user3419159

1

您可以使用arr2.Intersect(arr1).Count()

所以你的情況就會返回3,如arr2 3種元素存在於arr1

如果這不是你要求的,請澄清。

+3

我不認爲這是OP所要求的。這似乎是他/她要求'a'中的子序列的數量與'b'中的子序列的數量相等。 – elnigno

1

使用相交。此代碼片段將解決您的問題並打印所有重複項,並顯示arr1中每個重複項的計數。請注意,我也使用Linq Distinct(),因此當循環常見事件時,我只檢查一次,而不是更多。

 
      int[] arr1= new int[] {1,2,5,6,7,9,3,5,6,7}; 
      int[] arr2 = new int[] {5,6,7}; 
      var listCommon = arr1.AsEnumerable().Where(arr2.AsEnumerable().Contains); 

      foreach (var x in listCommon.Distinct()) { 
       var numberOfOccurencesInArr1 = arr1.Where(y => y == x).Count(); 
       Console.WriteLine(x + " is : " + numberOfOccurencesInArr1.ToString() + " times in arr1"); 
      } 

      Console.ReadLine(); 

有關更多信息,請參閱MSDN; http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect(v=vs.110).aspx

listCommon將是這兩個數組中的公共項的數量。

0

試試這個:

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); 

使用下面的小提琴請檢查該解決方案.NET fiddle

0

嘗試這個

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"; 
    } 
0

如果要算多少的一個整數的出現次數第二個陣列出現在第一個陣列中,那麼你可以寫

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"); 
0
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(); 
+0

這是不正確的,如果'arr1 = {5,5,5}'返回'1'。 – elnigno

0

正如你輸入是陣列可以使用索引,以有效地計數主陣列中的子陣列的出現次數:因爲567被發現,兩次在1256793567.

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

如果子陣列本身可能「重疊」(例如11中的111)所有「重疊」將被計數(例如,對於該示例,結果將是2)。如果這不是你的意圖,你只需在主循環的末尾提前索引i即可跳過找到的子數組。

0

您可以在int的第一個計數中使用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 
} 

注意,這種方法不關心秩序,它也不會在乎重複的次數第二個陣列。這可能是需要的或不需要。