2010-06-01 6 views
7

Ich habe zwei Integer-Listen (List<int>). Sie enthalten die gleichen Elemente, aber Liste 1 enthält Elemente, die nicht in der Liste enthalten sind 2.Find "nicht die gleichen" Elemente in zwei Arrays

So finden Sie, welche Elemente der Liste 1 sind nicht in der Liste 2.

Thanks :)

PS. lang ist C#

Antwort

3
new HashSet<int>(l1).ExceptWith(l2); 
-1

Wenn sie nicht sortiert oder etwas, werden Sie eine harte Zeit haben.

Entweder O (N^2) Algorithmus (a simple, stupid Loop) oder zusätzliche Datenstrukturen, mir sagen, was bevorzugen Sie.

Oder Sie können natürlich auch die Quelldaten ändern, indem das Sortieren, das nehme ich an keine Option ist.

+1

in welcher Weise wird sie sowohl in O Sortierung (N log N) nicht eine Möglichkeit? – Pieter

+0

Nun könnten Sie beide Listen O (kN) radix-sortieren und die Differenz O (N) berechnen. – kennytm

18

können Sie IEnumerable.Except verwenden:

list1.Except(list2); 
+0

+1. Du hast mich dazu geschlagen. – brickner

+0

konnte dies nicht tun, da das Argument von Except IEnumerable sein muss. Liste als Argument ist inakzeptabel. – trnTash

+3

@trnTash: Liste implementiert IEnumerable . Der Code ist korrekt. – dtb

0

Der Einfachheit halber können Sie mit der Contains-Methode und prüfen, ob eine Liste kein Element des anderen enthält:

for (int i = 0; i < list2.Count; ++i) 
{ 
    if (!list1.Contains(list2[i]) //current element is not in list 1 
     //some code 
} 
+0

Dies ist rückwärts und ein O (N^2) -Algorithmus. –

+0

dies könnte auch gut, aber die andere Lösung ist viel schneller und weniger Code – trnTash

1

Ein sehr einfach Lösung:

HashSet<int> theSet1 = new HashSet<int>(List1); 
theSet1.ExceptWith(List2); 
+0

HashSet half schließlich. Vielen Dank! – trnTash

+5

Sie bedanken sich für Ihre eigene Antwort? –

+2

Nein. An den Typen, der seinen Beitrag gelöscht hat. – trnTash

0

Wenn Ihre Lösung ist, dass Tannen Liste zweiter enthalten und Sie onli Aufzeichnungen der Jagd nach dem ersten Liste hinzugefügt, Vielleicht ist die

public static int DokleSuIsti(IList<string> prevzemNow, IList<string> prevzemOld) 
     { 
      int dobroja = 0; 
      int kolikohinaje; 
      if (prevzemOld.Count() < prevzemNow.Count()) 
      { 
       kolikohinaje = prevzemOld.Count(); 
      } 
      else 
      { 
       kolikohinaje = prevzemNow.Count(); 
      } 



      for (int i = 0; i < kolikohinaje; i++) 
      { 
       if (!Object.Equals(prevzemNow[i], prevzemOld[i])) 
       { 
        dobroja = i; 
        return dobroja; 
       } 
       dobroja = i; 
      } 
      return dobroja; 
     } 

Danach nützlich sein werden können Sie diesen Punkt int als Ausgang für Spaziergang durch Nutzung Ihres IList

Verwandte Themen