2015-10-03 15 views
7

Tôi có hai mảngLàm thế nào để lọc mảng bằng cách sử dụng phần tử trong một mảng trong Swift?

let toBeFiltered = ["star0", "star2", "star1", "star0", "star3", "star4"] 
let theFilter = ["star1", "star3"] 

Làm thế nào để lọc các mảng đầu tiên sử dụng mảng thứ hai? Trên thực tế các theFilter có thể thay đổi tự động, ví dụ như,

let theFilter = ["star2"] 
or maybe 
let theFilter = ["star0", "star4", "star2"] 

Nhờ sự giúp đỡ của bạn :)

Trả lời

3

này có vẻ là một chủ đề hôm nay :) xây dựng dựa trên một câu trả lời tuyệt vời, tôi sẽ đề nghị sử dụng phương pháp intersect(_:) trên Set:

let toBeFiltered = ["star0", "star2", "star1", "star0", "star3", "star4"] 
let theFilter = ["star1", "star3"] 
let filtered = Set(toBeFiltered).intersect(theFilter) 

// => ["star1", "star3"] of type Set<String> 

// ...if you actually need an array, you can get one using Array(filtered) 
2

Bạn cũng có thể lọc Struct mảng cũng

struct myStruct 
     { 
      var userid:String; 
      var details:String; 
      init() { 
      userid = "default value"; 
      details = "default"; 
      } 

    }; 
    var f1 = myStruct(); 
    f1.userid = "1"; 
    f1.details = "Good boy"; 

    var f2 = myStruct(); 
    f2.userid = "2"; 
    f2.details = "Bad boy"; 

    var f3 = myStruct(); 
    f3.userid = "3"; 
    f3.details = "Gentleman"; 

    var arrNames1:Array = [f1,f3]; 

    var arrNames2:Array = [f3,f1,f2]; 

    let filteredArrayStruct = arrNames1.filter({ (user: myStruct) -> Bool in 
     return arrNames2.contains({ (user1: myStruct) -> Bool in 
     return user.userid == user1.userid; 
     }) 
    }) 
print(filteredArrayStruct) 

Đối với Set, bạn phải tuân theo giao thức Hashable

class mytestclass: Hashable 
{ 
    var userid:Int ; 
    var details:String; 

    var hashValue: Int { 
    return self.userid 
    } 
    init(userid: Int, details:String) 
{ 
    self.userid = userid; 
    self.details = details; 
    } 
} 
func ==(lhs: mytestclass, rhs: mytestclass) -> Bool { 
    return lhs.userid == rhs.userid 
} 

var t1 = mytestclass(userid: 1,details: "Good boy"); 


var t2 = mytestclass(userid: 2,details: "bad boy"); 

var t3 = mytestclass(userid: 3,details: "gentle man"); 


var classArrayNames:Set<mytestclass> = [t1,t2]; 

var classArrayNames2:Set<mytestclass> = [t3,t1,t2]; 


let result = Set(classArrayNames).intersect(classArrayNames2) 
Các vấn đề liên quan