2d阵列过滤器swift

时间:2016-01-17 12:01:11

标签: ios swift multidimensional-array

我正在尝试根据用户输入的字符串/文本从2d数组中过滤数据,就像我们写一个人的姓名或电话号码一样,搜索并显示联系人详细信息。

在2D数组[[“名称”,“电话号码”]]中。如果用户输入的数字或名称与任何值匹配,那么将存储在另一个数组中。

var data : [[String]] = [["AB","+923476760226"],["Umair","+923366111830"],.......]

4 个答案:

答案 0 :(得分:6)

过滤2D数组的方法是每层过滤两次。

var data = [["AB","+923476760226"],["Umair","+923366111830"]]
let searchString = "+9234"

var result = data.filter { (dataArray:[String]) -> Bool in
    return dataArray.filter({ (string) -> Bool in
        return string.containsString(searchString)
    }).count > 0
}

此代码只过滤掉至少包含一个包含searchString的项目的所有项目。

但是,我想说你真的应该把名字和数字保存在一个单独的类或结构中并构建一些马赫函数,这样你就不必过滤两次了

struct Contact{
    let name: String
    let number: String

    init(name: String, number:String) {
        self.name = name
        self.number = number
    }

    func match(string:String) -> Bool {
        return name.containsString(string) || number.containsString(string)
    }
}


let properData = [Contact(name: "AB", number: "+923476760226"), Contact(name: "Umair", number: "+923366111830")]

let properResult = properData.filter { (contact) -> Bool in
    return contact.match(searchString)
}

从长远来看,这将使您的代码更清晰,并且通常使用这样的类和结构

答案 1 :(得分:0)

在应用程序中使用[["Name","Phone number"]]的更好方法是使用字典数组或元组数组。

在字典数组的情况下,您的结构将如下:

var record1:[String:String] = ["name":"AB", "Phonenumber":"+923476760224"]
var record2:[String:String] = ["name":"AC", "Phonenumber":"+923476760225"]
var record3:[String:String] = ["name":"BC", "Phonenumber":"+923476760226"]
var data : [[String:String]] = [record1, record2, record3];

现在您可以应用谓词来使用过滤器。

let pred = (NSPredicate(format: "%K == %@", "name", "AB")!)

或者如果你想使用元组,你可以参考 Apply NSPredicate on [(String, Array<String>)]

答案 2 :(得分:0)

这项工作对我来说有了矿工的改变。谢谢。 @Moriya在Swift 1.2中有代码对我有用。 我在searchBar中使用它。

    var data = [["AB","+923476760226"],["Umair","+923366111830"]]

   func searchBar(searchBar: UISearchBar, textDidChange searchText: String)           {

           var result = data.filter { (dataArray:[String]) -> Bool in
            return dataArray.filter({ (str : String) -> Bool in
                    return str.rangeOfString(searchText, options: .CaseInsensitiveSearch) != nil    
                }).count > 0
                }
        tableView.reloadData()

}

答案 3 :(得分:0)

下一个是我的解决方案。使用arr.flatMap()用于从2d数组转义的一维数组的结果,因为可以完成我的任务。 也许对某人会有帮助

struct Citizen {
    let name: String
    let age: String

    func match(string: String) -> Bool {
        return name.lowercased().contains(string.lowercased()) || age.lowercased().contains(string.lowercased())
    }
}

let arr = [[Citizen(name: "Jak", age: "20"), Citizen(name: "Barbara", age: "24")], [Citizen(name: "Bob", age: "50"), Citizen(name: "Sarah", age: "48")]]

let flatArr = arr.flatMap { $0 }
let searchName = "B"
let filteredArr = flatArr.filter{ (item) -> Bool in
            return item.matchName(string: searchName)
        }

print(filteredArr)

//[Citizen(name: "Barbara", age: "24"), Citizen(name: "Bob", age: "50")]