swift2 如何在Swift中使用另一个数组中的元素过滤数组?

dgiusagp  于 2022-11-06  发布在  Swift
关注(0)|答案(6)|浏览(229)

我有两个数组

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

如何使用第二个数组过滤第一个数组?实际上theFilter是可以动态改变的,例如,

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

谢谢你的帮助:)

5ssjco0h

5ssjco0h2#

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

let filtered = toBeFiltered.filter(theFilter.contains)
zfycwa2u

zfycwa2u3#

您也可以筛选Struct数组

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)

对于Set,您必须符合哈希协议

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

kb5ga3dv4#

这似乎是今天的主题:)基于另一个很好的答案,我建议在Set上使用intersect(_:)方法:

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

omtl5h9j5#

let mainArray = ["one", "two", "three", "three", "three", "four", "five"]
let miniArray = ["two", "three"]
let leftOvers = mainArray.filter( {miniArray.contains($0) == false} )
print(leftOvers)
j2cgzkjk

j2cgzkjk6#

虽然使用Arsen建议的Sets无疑是最优雅的,但有时您希望保留副本顺序

//: Playground - noun: a place where people can play

import Foundation

extension Collection where Element: Equatable {

    func intersection(with filter: [Element]) -> [Element] {
        return self.filter { element in filter.contains(element) }
    }

}

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

let filtered = toBeFiltered.intersection(with: theFilter) // ["star1", "star3", "star1"]

相关问题