2016-11-23 1 views
0

Es gibt zwei Scheiben im Schnurtyp. Ich will, dass Abfangenergebnis in den zwei Scheiben in Golang gefunden wird. Ich will die beste Lösung eher finden, als jede Scheibe iterierend.Wie man Ergebnis des Abschnitts von zwei Scheiben im Golang findet

first_slice := []string{"F8-E7-1E-14-AE-00", "F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E0","84-18-3A-2F-05-E8" } 
second_slice := []string{"F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E8","F8-E7-1E-54-AE-08"} 


Output: 
    result_slice := []string{"F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E8"} 

Ich habe folgende Ansätze verwenden, aber es ist nicht die beste Ansätze für große Datenmenge.

var result_slice *[]string 

for _, i := range first_slice { 
    for _, x := range second_slice { 
     if i == x { 
      &result_slice.append(i) 
     } 
    } 
} 

Schätzen Sie, wenn Sie mir eine gute Lösung geben.

+0

Dies sind 'Slice', nicht Array! –

+2

Füllen Sie die Strings des kürzeren Slice in eine Map als Schlüssel für O (1) Lookup of Existence und iterieren Sie das längere Slice, indem Sie die Werte in der Map nachschlagen, die an das Resultset angehängt werden, falls es gefunden wird. Benötigt mehr Speicher als Ihr Ansatz. Kompromisse wie immer. – Volker

+1

Zugehörige/mögliche Duplikate: [Prüfen, ob ein Wert in einer Liste enthalten ist] (http://stackoverflow.com/a/30452518/1705598); und [Wie kann ich ein Array erstellen, das eindeutige Zeichenfolgen enthält?] (http://stackoverflow.com/a/33207265/1705598); und [Effiziente Methode zur Überprüfung der IP-Adresse in IP-Adressen in Golang] (http://stackoverflow.com/a/39249045/1705598); und [Eindeutige Elemente in einem Go-Slice oder -Array finden] (http://stackoverflow.com/a/34111576/1705598) – icza

Antwort

2
firstSlice := []string{"F8-E7-1E-14-AE-00", "F8-E7-1E-14-D0-30", 
    "84-18-3A-2F-05-E0", "84-18-3A-2F-05-E8"} 
secondSlice := []string{"F8-E7-1E-14-D0-30", "84-18-3A-2F-05-E8", 
    "F8-E7-1E-54-AE-08"} 

resultSlice := []string{} 
checkMap := map[string]struct{}{} 

for _, addr := range firstSlice { 
    checkMap[addr] = struct{}{} 
} 
for _, addr := range secondSlice { 
    if _, ok := checkMap[addr]; ok { 
     resultSlice = append(resultSlice, addr) 
    } 
} 

fmt.Println(resultSlice) 

Der Ausgang ist das, was Sie wollen.

Eine leere Struktur nimmt keinen Platz in monery

Was mehr ist, immer Kamel in golang verwenden.

+0

Wie ist die Leistung für große Datenmenge mit diesem .. ist dieser Grund, Karte zu verwenden. –

+0

@SandunPriyanka Die Zeitkomplexität ist O (n), was viel besser ist als die, die Sie bei O (n^2) veröffentlicht haben. Das einzige Problem ist, dass mehr Speicher benötigt wird. Mit leerer Struktur kann etwas Speicher gespart werden – PapEr

+0

Danke für die Hilfe. –

Verwandte Themen