2016-09-12 7 views
1

Ich habe ein Array von benutzerdefinierten Objekten und möchte wissen, wie man erkennt, welche Objekte Duplikate sind. Ich weiß, wie man die Duplikate entfernt, aber das ist nicht die Funktionalität, nach der ich suche. Im mit schnellem 2.Identifizieren von Duplikaten in Array

Beispiel:

var movies: [Movie] = ["Batman v Superman: Dawn of Justice", "Batman v Superman: Dawn of Justice", "Deadpool"," "Deadpool", "Hardcore Henry", "Jason Bourne", "Jurassic World"] 

So mag ich mit der Liste der Filme eine Tabellenansicht zeigen, oben, aber mit „Batman“ und „Deadpool“ hervorgehoben.

Für mehr Klarheit über das, was ich erreichen möchte, schauen Sie sich den Screenshot an. Ich habe eine Liste von Filmen, die zwei Benutzer in einem früheren View-Controller auswählen. Ich möchte die ausgewählten Filme in einer Tabellenansicht anzeigen. Ich möchte speziell zeigen, ob es Filme gab, die beide ausgewählt haben.

enter image description here

+0

Möchten Sie nur Filme anzeigen, die mehrfach ausgewählt wurden? z.B. Batman gegen Superman? – tech4242

+0

@ tech4242 Ich möchte alle ausgewählten Filme zeigen. Wenn ein Film mehrmals ausgewählt wurde, ändere ich das blaue Feld in der Tabellenansicht in grün.Das macht Sinn? – PoisonedApps

+0

Es tut mir leid, aber ich bin mir nicht sicher, ob ich dir folgen kann - was meinst du mit Identität? – tech4242

Antwort

4

Basierend auf Ihren Kommentar, den ich ein einfaches Beispiel mit String-Arrays gemacht haben, die leicht zu Ihrem Film Typ umgewandelt werden kann:

let movies = ["Batman","Batman","Flash","Avengers"] 
var movieCounts:[String:Int] = [:]  
for movie in movies { 
movieCounts[movie] = (movieCounts[movie] ?? 0) + 1 
} 

Und Sie können es wie folgt testen:

for (key, value) in movieCounts { 
print("\(key) has been selected \(value) time/s") 
} 
+0

Das wird nicht funktionieren. 'movies.contains (Film)' wird immer wahr sein. – bdjett

+0

@bdjett danke! Das hätte ich fast vermisst. Ich werde es bearbeiten – tech4242

+0

Richtig verstehe ich das völlig, aber das ist nur die doppelten Filme. Wie zeige ich auch den Blitz und die Rächer, während ich zeige, dass Batman von beiden gewählt wurde? Es ist schwer, über den Text klarzustellen, tut mir leid. – PoisonedApps

0

Warum nicht eine ID in dem Film-Objekt hinzugefügt

und vergleichen Sie die beiden Arrays das gleiche Objekt zu suchen.

public class Movie:Equatable{ 
    var id=NSUUID().UUIDString 
} 

public func ==(lhs: Movie, rhs: Movie) -> Bool{ 
    return lhs.id == rhs.id 
} 

Vergleicht man die Arrays:

var moviesA=[Movie]() 
    var moviesB=[Movie]() 

    var sharedMovies=[Movie]() 
    for movie in moviesA{ 
     if moviesB.contains(movie){ 
      sharedMovies.append(movie) 
     } 
    } 
0

Nicht sicher, welche Funktionen Sie ausführen möchten.

Wenn nur für die Liste der Einzelteile, Sie swift Wörterbuch Duplikate zählen können, durch 0 durch Starten Filmnamen als Schlüssel und zählen als Wert mit

Wenn Sie hervorheben möchten, können Sie unterschiedliche Art verwenden, wenn Sie füllen die Tabelle in der Delegate-Methode, indem Sie überprüfen, ob das Element Duplikate enthält.

3

Ich versuche im Allgemeinen zu vermeiden, Antworten mit Code zu schreiben, der vollständig von jemand anderem geschrieben wurde (MIT License), aber der Verweis unten ist so ein passender für diese Frage, die ich glaube, dass es als Antwort lohnt.


Die Lösung verwendet, um die gleiche Technik wie die Antwort akzeptiert, sondern auf einer allgemeineren Form (kompakt mit einer ordentlichen subscript Erweiterung Dictionary): Die freq() dictionary extension aus GitHub user oisdk's excellent SwiftSequence framework (MIT License):

/* --------------------------------------------------------------------------- 
    source: GitHub user oisdk: 
    https://github.com/oisdk/SwiftSequence/blob/master/Sources/Categorise.swift */ 
private extension Dictionary { 
    subscript(key: Key, or or: Value) -> Value { 
    get { return self[key] ?? or } 
    set { self[key] = newValue } 
    } 
} 

public extension SequenceType where Generator.Element : Hashable { 
    // MARK: Frequencies 

    /** 
    Returns a dictionary where the keys are the elements of self, and 
    the values are their respective frequencies 
    ```swift 
    [0, 3, 0, 1, 1, 3, 2, 3, 1, 0].freqs() 
    // [2: 1, 0: 3, 3: 3, 1: 3] 
    ``` 
    */ 
    @warn_unused_result 
    func freqs() -> [Generator.Element:Int] { 
    var freqs: [Generator.Element:Int] = [:] 
    for el in self { freqs[el, or: 0] += 1 } 
    return freqs 
    } 
} 
/* --------------------------------------------------------------------------- */ 

/* example usage */ 
let movies = ["Batman","Batman","Flash","Avengers"] 
print(movies.freqs()) // ["Avengers": 1, "Flash": 1, "Batman": 2] 

Werfen Sie einen Blick auf das Framework für viele andere Sequenz Goodies:

Verwandte Themen