2016-03-07 91 views
0

我要证明,如果我的阵列筛选[字符串]]自定义范围

let actualSigns = ["Aa", "Bb", "Cc"] 

...等于这一个内部的阵列中的一个......

var validSigns = [[String]]() 
validSigns.append(["Aa", "Bb", "Cc", "Dd"]) // want to match this 
validSigns.append(["Aa", "Bb", "Cc", "Xy"]) // ... and this 
validSigns.append(["Ee", "Ff", "Gg", "Hh"]) 

。 ..只比较actualSigns的对象数量。

所以在这种情况下,我想匹配validSigns中的第一个和第二个数组,因为前三个值等于actualSigns

我试图对其进行筛选

let range = Range(start: actualSigns.count, end: actualSigns.count+1) 
let match = validSigns.filter{ $0.removeRange(range) == actualSigns } 

但是编译器说'$0 is a let constant'。我怎么解决这个问题?

+0

是否为了此事?单个数组中的每个元素是否都是唯一的?数组是否会始终处于相同的位置 - 即:总是在数组的开始还是结束? – ColGraff

回答

2

使用startsWith这样的你想测试的阵列。

let match = validSigns.filter{$0.startsWith(actualSigns)} 

enter image description here

+0

有趣的是,之前没有使用'startsWith()'。 – Eendje

+0

非常感谢Eric。工作非常好! – ixany

2

我不知道如果我理解正确的你,但你并不需要使用范围得到匹配:

// My original answer 
let match = validSigns.filter { !zip($0, actualSigns).contains { $0.0 != $0.1 } } 

// Based on Price Ringo's answer 
let match = validSigns.filter { $0.startsWith(actualSigns) } 

输出:

[["Aa", "Bb", "Cc", "Dd"], ["Aa", "Bb", "Cc", "Xy"]] 
+0

谢谢Eendje!你的原始答案也适用。 – ixany

0

您可以通过执行改正错误:

let match = validSigns.filter{ var input = $0; input.removeRange(range); return input == actualSigns } 

其他一些方法,只是为了完整性:

import Foundation 

let actualSigns = ["Aa", "Bb", "Cc"] 
var validSigns = [ 
    ["Aa", "Bb", "Cc", "Dd"], 
    ["Aa", "Bb", "Cc", "Xy"], 
    ["Ee", "Ff", "Gg", "Hh"], 
    ["Ee", "Aa", "Bb", "Cc"]] // Added another case, to test when the matching array is not at the start 

let matches = validSigns.filter { $0.joinWithSeparator("").containsString(actualSigns.joinWithSeparator("")) } 
// => [["Aa", "Bb", "Cc", "Dd"], ["Aa", "Bb", "Cc", "Xy"], ["Ee", "Aa", "Bb", "Cc"]] 

let matches2 = validSigns.filter { Set($0).intersect(Set(actualSigns)).count == actualSigns.count } 
// => [["Aa", "Bb", "Cc", "Dd"], ["Aa", "Bb", "Cc", "Xy"], ["Ee", "Aa", "Bb", "Cc"]]