Swift - 替换多个数组中数组的重复字符串
Swift - Replace Array's repeated Strings in multiple Arrays
class MyClass:UIViewController{
var myArr = ["John", "Eugene", "George", "John", "Lucy", "George"]
var myArr2 = ["28 years old", "20 years old", "30 years old", "28 years old", "18 years old", "30 years old"]
var myArr3 = ["3rd Avenue", "Long Beach rd.", "Hollywood Blvd.", "3rd Avenue", "5th street", "Hollywood Blvd."]
viewDidLoad(){
super.viewDidLoad()
removeRepeatedStringsFromArrays(myArr, [myArr2, myArr3])
}
func removeRepeatedStringsFromArrays(keyArray: [String], valuesArrays: [[String]]) -> [[String]]{
//do the func and I want myArr to be changed directly in func like:
keyArray = myArr.withoutRepeats
//and other arrays to be returned with removed repeated indexes from keyArray indexes
}
}
代码执行后的预期结果:
myArr = ["John", "Eugene", "George", "Lucy"]
myArr2 = ["28 years old", "20 years old", "30 years old", "18 years old"]
myArr3 = ["3rd Avenue", "Long Beach rd.", "Hollywood Blvd.", "5th street"]
函数能否在函数内部更改 myArr2 和 myArr3,或者我必须在 [[String]] 中 return 它们并执行此操作:
myArr2 = removeRepeatedStringsFromArrays(myArr, [myArr2, myArr3]).0
myArr3 = removeRepeatedStringsFromArrays(myArr, [myArr2, myArr3]).1
?
swift 中的数组使用值语义并按值传递到方法中
和函数(它们不是通过引用传递的)。因此,如果您在方法内部修改数组,这不会在 method.To 通过引用传递数组并能够修改它的范围之外产生任何影响,您应该使用参数运算符 "inout" 传递它,使其成为输入输出参数。 In-out实际上意味着通过引用传递值,而不是通过值传递值。因此,如果您决定按值传递数组,则需要像您当前所做的那样 return 它们,但是如果您按引用传递数组,则不需要 return 任何东西。
还要检查数组是否包含重复项,您可以使用此通用方法:
func distinct<T: Equatable>(source: [T]) -> [T]
{
var unique = [T]()
for item in source {
if !contains(unique, item)
{
unique.append(item)
}
}
return unique
}
不,您将无法编写将数组数组传递到其中并从源数组中删除条目的函数。您将不得不直接在方法中删除它们。您可以通过首先创建一个仅查找第一个唯一条目的索引的函数来执行此操作:
func indicesOfUniques<T: Hashable>(source: [T]) -> [Int] {
var seen: Set<T> = []
return filter(indices(source)) {
if seen.contains(source[[=10=]]) {
return false
}
else {
seen.insert(source[[=10=]])
return true
}
}
}
然后,使用按特定索引过滤的助手:
extension Array {
func filterByIndex<S: SequenceType where S.Generator.Element == Int>(indices: S) -> [T] {
return Array(PermutationGenerator(elements: self, indices: indices))
}
}
你删除了所有对应的索引:
class MyClass {
var myArr = ["John", "Eugene", "George", "John", "Lucy", "George"]
var myArr2 = ["28 years old", "20 years old", "30 years old", "28 years old", "18 years old", "30 years old"]
var myArr3 = ["3rd Avenue", "Long Beach rd.", "Hollywood Blvd.", "3rd Avenue", "5th street", "Hollywood Blvd."]
func viewDidLoad() {
removeRepeatedStringsFromArrays()
}
func removeRepeatedStringsFromArrays() {
let uniques = indicesOfUniques(myArr)
myArr = myArr.filterByIndex(uniques)
myArr2 = myArr2.filterByIndex(uniques)
myArr3 = myArr3.filterByIndex(uniques)
}
}
但是,您可能会发现完全抛弃数组并将此数据表示为数据结构要容易得多:
struct Person {
let name: String
let age: Int
let address: String
}
class MyClass:UIViewController{
var people = [
Person(name: "John", age: 28, address: "3rd Avenue"),
Person(name: "Eugene", age: 20, address: "Long Beach rd."),
// etc...
]
viewDidLoad() {
super.viewDidLoad()
var seen: Set<String> = []
people = people.filter {
if seen.contains([=13=].people.name) {
return false
}
else {
seen.insert([=13=].people.name)
return true
}
}
}
}
class MyClass:UIViewController{
var myArr = ["John", "Eugene", "George", "John", "Lucy", "George"]
var myArr2 = ["28 years old", "20 years old", "30 years old", "28 years old", "18 years old", "30 years old"]
var myArr3 = ["3rd Avenue", "Long Beach rd.", "Hollywood Blvd.", "3rd Avenue", "5th street", "Hollywood Blvd."]
viewDidLoad(){
super.viewDidLoad()
removeRepeatedStringsFromArrays(myArr, [myArr2, myArr3])
}
func removeRepeatedStringsFromArrays(keyArray: [String], valuesArrays: [[String]]) -> [[String]]{
//do the func and I want myArr to be changed directly in func like:
keyArray = myArr.withoutRepeats
//and other arrays to be returned with removed repeated indexes from keyArray indexes
}
}
代码执行后的预期结果:
myArr = ["John", "Eugene", "George", "Lucy"]
myArr2 = ["28 years old", "20 years old", "30 years old", "18 years old"]
myArr3 = ["3rd Avenue", "Long Beach rd.", "Hollywood Blvd.", "5th street"]
函数能否在函数内部更改 myArr2 和 myArr3,或者我必须在 [[String]] 中 return 它们并执行此操作:
myArr2 = removeRepeatedStringsFromArrays(myArr, [myArr2, myArr3]).0
myArr3 = removeRepeatedStringsFromArrays(myArr, [myArr2, myArr3]).1
?
swift 中的数组使用值语义并按值传递到方法中 和函数(它们不是通过引用传递的)。因此,如果您在方法内部修改数组,这不会在 method.To 通过引用传递数组并能够修改它的范围之外产生任何影响,您应该使用参数运算符 "inout" 传递它,使其成为输入输出参数。 In-out实际上意味着通过引用传递值,而不是通过值传递值。因此,如果您决定按值传递数组,则需要像您当前所做的那样 return 它们,但是如果您按引用传递数组,则不需要 return 任何东西。
还要检查数组是否包含重复项,您可以使用此通用方法:
func distinct<T: Equatable>(source: [T]) -> [T]
{
var unique = [T]()
for item in source {
if !contains(unique, item)
{
unique.append(item)
}
}
return unique
}
不,您将无法编写将数组数组传递到其中并从源数组中删除条目的函数。您将不得不直接在方法中删除它们。您可以通过首先创建一个仅查找第一个唯一条目的索引的函数来执行此操作:
func indicesOfUniques<T: Hashable>(source: [T]) -> [Int] {
var seen: Set<T> = []
return filter(indices(source)) {
if seen.contains(source[[=10=]]) {
return false
}
else {
seen.insert(source[[=10=]])
return true
}
}
}
然后,使用按特定索引过滤的助手:
extension Array {
func filterByIndex<S: SequenceType where S.Generator.Element == Int>(indices: S) -> [T] {
return Array(PermutationGenerator(elements: self, indices: indices))
}
}
你删除了所有对应的索引:
class MyClass {
var myArr = ["John", "Eugene", "George", "John", "Lucy", "George"]
var myArr2 = ["28 years old", "20 years old", "30 years old", "28 years old", "18 years old", "30 years old"]
var myArr3 = ["3rd Avenue", "Long Beach rd.", "Hollywood Blvd.", "3rd Avenue", "5th street", "Hollywood Blvd."]
func viewDidLoad() {
removeRepeatedStringsFromArrays()
}
func removeRepeatedStringsFromArrays() {
let uniques = indicesOfUniques(myArr)
myArr = myArr.filterByIndex(uniques)
myArr2 = myArr2.filterByIndex(uniques)
myArr3 = myArr3.filterByIndex(uniques)
}
}
但是,您可能会发现完全抛弃数组并将此数据表示为数据结构要容易得多:
struct Person {
let name: String
let age: Int
let address: String
}
class MyClass:UIViewController{
var people = [
Person(name: "John", age: 28, address: "3rd Avenue"),
Person(name: "Eugene", age: 20, address: "Long Beach rd."),
// etc...
]
viewDidLoad() {
super.viewDidLoad()
var seen: Set<String> = []
people = people.filter {
if seen.contains([=13=].people.name) {
return false
}
else {
seen.insert([=13=].people.name)
return true
}
}
}
}