arrays - Swift 2 从包含字符串的数组中删除对象
问题描述
我在 Swift 2 中有字符串数组:
var myList : [String] = []
我里面有动态字符串,我用*
字符 myList 例子来爆炸它们:
print(myList[0]) output = 2018-04-05*type2*namea
print(myList[1]) output = 2018-04-05*type2*nameb
print(myList[2]) output = 2018-04-05*type3*nameb
print(myList[3]) output = 2018-04-06*type3*named
我想删除myList 中有type3的对象:
如果在相同的日期和相同的名字并且有type2的
必须是这样的我的字符串:
print(myList[0]) output = 2018-04-05*type2*namea
print(myList[1]) output = 2018-04-05*type2*nameb
print(myList[2]) output = 2018-04-06*type3*named
必须删除以下项目:
print(myList[2]) output = 2018-04-05*type3*nameb
如果之前的 type2 基本上具有相同的日期和相同的名称,我想删除 myList 中的 type3 。
解释:
2018-04-05*type2*nameb
并且2018-04-05*type3*nameb
,具有相同的日期和相同的名称,但2018-04-05*type3*nameb
之前有type2 (2018-04-05*type2*nameb) ?所以必须删除2018-04-05*type3*nameb 行
我该怎么做?
解决方案
这个操场代码将做你想做的事:
//: Playground - noun: a place where people can play
import UIKit
let myList = ["2018-04-05*type2*namea",
"2018-04-05*type2*nameb",
"2018-04-05*type3*nameb",
"2018-04-06*type3*named"]
//Define a class that lets us map from a string to a date, type, and name string
class ListEntry {
let fullString: String
//define lazy vars for all the substrings
lazy var subStrings: [Substring] = fullString.split(separator: "*")
lazy var dateString = subStrings[0]
lazy var typeString = subStrings[1]
lazy var nameString = subStrings[2]
//Create a failable initializer that takes a full string as input
//and tries to break it into exactly 3 substrings
//using the "*" sparator
init?(fullString: String) {
self.fullString = fullString
if subStrings.count != 3 { return nil }
}
}
print("---Input:---")
myList.forEach { print($0) }
print("------------")
//Map our array of strings to an array of ListEntry objects
let items = myList.compactMap { ListEntry(fullString: $0) }
//Create an output array
var output: [String] = []
//Loop through each item in the array of ListEntry objects, getting an index for each
for (index,item) in items.enumerated() {
//If this is the first item, or it dosn't have type == "type3", add it to the output
guard index > 0,
item.typeString == "type3" else {
print("Adding item", item.fullString)
output.append(item.fullString)
continue
}
let previous = items[index-1]
/*
Add this item if
-the previous type isn't "type2"
-the previous item's date doesn't match this one
-the previous item's name doesn't match this one
*/
guard previous.typeString == "type2",
item.dateString == previous.dateString,
item.nameString == previous.nameString else {
print("Adding item", item.fullString)
output.append(item.fullString)
continue
}
print("Skipping item ", item.fullString)
}
print("\n---Output:---")
output.forEach { print($0) }
上面代码的输出是:
---Input:---
2018-04-05*type2*namea
2018-04-05*type2*nameb
2018-04-05*type3*nameb
2018-04-06*type3*named
------------
Adding item 2018-04-05*type2*namea
Adding item 2018-04-05*type2*nameb
Skipping item 2018-04-05*type3*nameb
Adding item 2018-04-06*type3*named
---Output:---
2018-04-05*type2*namea
2018-04-05*type2*nameb
2018-04-06*type3*named
推荐阅读
- dart - 在 TextInputType 更改后控制器重置的 Flutter TextField
- python - 如何在python中沿曲线注释文本并旋转线条?
- kentico - Kentico - 网络分析仪表板不断刷新
- rabbitmq - RabbitMQ 服务器正在下降
- c# - WIMMountImageHandle 导致 ERROR_INVALID_HANDLE
- rxjs - 使用 angular5/rxjs 刷新下拉内容
- python - python3中很奇怪的事情
- matlab - 4 种不同的 Matlab 函数来估计数据的 PDF 给出 4 种不同的结果
- spring - 实时更新 webflux 流
- android - Android Webview 错误代码-6