【问题标题】:Swift: How to split an array of Strings into multiple arrays of matching value?Swift:如何将字符串数组拆分为多个匹配值的数组?
【发布时间】:2016-08-09 12:18:42
【问题描述】:

假设我有一个值数组(按字母顺序),例如 [A, B, B, B, D, G, G, H, M, M, M, M, Z] 代表用户的姓氏。我正在寻找创建一个表索引,那么将这样的数组(姓氏以所有字母开头的任意数量的用户)分隔成数组的最佳方法是什么,例如[A] [B, B, B] [D] [G, G] [H] [M, M, M, M] [Z] 这似乎是为具有多个部分的表创建值的最佳方法,其中用户以姓氏分隔。感谢您的帮助!

【问题讨论】:

    标签: arrays swift uitableview sorting swift2


    【解决方案1】:

    您可以使用name.characters.first 获取名称的首字母,并通过比较它们来构建一个数组数组:

    let names = ["Aaron", "Alice", "Bob", "Charlie", "Chelsea", "David"]
    
    var result: [[String]] = []
    var prevInitial: Character? = nil
    for name in names {
        let initial = name.characters.first
        if initial != prevInitial {  // We're starting a new letter
            result.append([])
            prevInitial = initial
        }
        result[result.endIndex - 1].append(name)
    }
    
    print(result)  // [["Aaron", "Alice"], ["Bob"], ["Charlie", "Chelsea"], ["David"]]
    

    【讨论】:

    • 非常感谢。如何修改行 let initial = name.characters.first 以便它检测空格后的字符(用于姓氏)?即我希望它按John Doe中的D排序
    • 您可以查看this answer,了解在空格处拆分字符串的方法。
    【解决方案2】:

    我认为这样做的好方法是使用过滤器。试试这个代码:

    var array = ["Aa", "Ab", "Bb", "Cc","d", "DDD"]
    
    let A_array = array.filter({
        ($0.characters.first == "A" || $0.characters.first == "a" )
    })
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:
      Dictionary(grouping: names) { $0.split(separator: " ").last?.first } .values
      

      必要时排序!

      【讨论】:

        【解决方案4】:

        您需要遍历原始数组并将其重建为新数组。这是一个例子:

        $names = array ('anthony', 'bernie', 'bob', 'hank', 'mary', 'mike', 'steve', 'tom', 'tony');
        $new_names = array();
        
        foreach ($names as $name) {
          //get first letter of name
          $firstletter = substr($name, 0,1);
        
          //test if there is already an array for this letter
          //if not, create it
          if (!$new_names[$firstletter]) {
              $new_names[$firstletter] = array();
          }
        
          //add the name to the new array under the correct first letter
          array_push($new_names[$firstletter], $name);
        }
        

        【讨论】:

        • 不错的答案,但不幸的是这不是 PHP :(
        • 我正在 Swift 中寻找答案。不过感谢您的回复!
        • 我的错。把我的头淹没在 php 中,没看到你需要 swift
        猜你喜欢
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        相关资源
        最近更新 更多