【问题标题】:Split a list into two based on the filters in swift根据 swift 中的过滤器将列表分成两部分
【发布时间】:2020-09-14 10:44:29
【问题描述】:

有一个国家名称列表,如果我搜索一个以 B 开头的国家,我如何将搜索拆分为所有以 B 开头的国家作为列表,其余国家作为另一个列表,然后合并两者都使带有“B”的国家/地区位于顶部

【问题讨论】:

    标签: arrays swift filter


    【解决方案1】:

    您可以使用sorted(by:) 来实现您的目标。您只需使用prefix 运算符检查当前元素和下一个元素是否以您的搜索词开头,如果当前元素确实以它开头,但下一个元素没有,则将当前元素排序在下一个元素之前,否则保留当前顺序。

    extension Array where Element == String {
        /// Sorts the array based on whether the elements start with `input` or not
        func searchSort(input: Element) -> Array {
            sorted(by: { current, next in current.hasPrefix(input) && !next.hasPrefix(input) })
        }
    }
    
    ["Austria", "Belgium", "Brazil", "Denmark", "Belarus"].searchSort(input: "B")
    

    输出:["Belgium", "Brazil", "Belarus", "Austria", "Denmark"]

    【讨论】:

      【解决方案2】:

      搜索栏需要它吗?如果是,试试这个:

      let filteredCountries = CountriesArray.filter({ (country: String) -> Bool in
                  return country.lowercased().contains(searchText.lowercased()) && country.hasPrefix(searchText)
              })
      

      另外,为了排序,试试这个:

      let sortedArray =  filteredCountries.sorted(by: { $0.lowercased() < $1.lowercased() })
      

      即使您不需要它作为 searchBar,探索 filter() 方法,它也非常有用且易于使用。

      【讨论】:

      • 为什么要让filteredCountries 成为一个可变变量,然后立即为其赋值?你可以做let filteredCountries = CountriesArray.filter...。此外,您的代码实际上并没有实现排序,只是过滤。
      • 编辑了我的代码。谢谢。没看到他也要求排序。
      【解决方案3】:

      您也可以使用 Dictionary 进行拆分,它不会对键进行排序,但是您可以使用分隔的数组:

      let a = ["FF0000", "000000", "0083FF", "FBE58D", "7A9EB0", "909CE1"]
      let b = Dictionary(grouping: a, by: { $0.first! })
      
      print(b) //["0": ["000000", "0083FF"], "7": ["7A9EB0"], "F": ["FF0000", "FBE58D"], "9": ["909CE1"]]
      

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 2021-07-17
        • 2015-02-20
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多