如何遍历数组并根据字符串值删除项目[重复]
Posted
技术标签:
【中文标题】如何遍历数组并根据字符串值删除项目[重复]【英文标题】:How to iterate through Array and remove an item based off a string value [duplicate] 【发布时间】:2016-09-30 05:52:25 【问题描述】:我有一个带有 is 前缀的字符串。我正在迭代一个字符串数组,如果该值包含前缀,那么我想从Array
中删除该项目。我的代码给了我错误:
致命错误:索引超出范围。
我需要一些关于如何处理此类事情的指导。
for (index, value) in arrayValues.enumerated()
if value.contains(prefixValue)
arrayValues.remove(at: index)
【问题讨论】:
你的arrayValues是如何定义的? var arrayValues = JSON["array"] as? [String] ,我正在下载这个表单一个 API 而print(arrayValues)
输出是?
[“rehjileo”、“rehjhzse”、“rehjlsid”、“uvhydtkc”、“rehjxeyl”、“dyxejbrq”、“rehjknwz”、“rehjrewz”、“rehjqlam”、“ynabgzuq”、“ rehjpfbv”、“pvuaokhl”、“rehjzhlv”、“rehjwxhj”、“chfmptev”、“ixgabfwj”、“mvhnkusg”、“lvfcipnt”、“rehjlhrn”、“rehjiosy”]
var filterArray = arrayValues.filter !$0.lowercased().contains(prefixValue) 适用于此解决方案。
【参考方案1】:
您是否尝试过为此使用filter
。
var filterArray = arrayValues.filter !$0.contains(prefixValue)
对于不区分大小写的 Swift 3
var filterArray = arrayValues.filter !$0.lowercased().contains(prefixValue)
对于不区分大小写的 Swift 2.3 或更低版本
var filterArray = arrayValues.filter !$0.lowercaseString.contains(prefixValue)
编辑:我有 filter
和 contains
的数组,因为 OP 用 contains 提出了问题,但由于某种原因,其他人认为这是错误的答案。所以现在我要添加filter
和hasPrefix
。
var filterArray = arrayValues.filter !$0.lowercased().hasPrefix(prefixValue)
【讨论】:
欢迎朋友 :) 这将过滤包含reh
的字符串。
@Mr.UB 我已经根据操作问题给出了答案,这就是我使用包含的原因。
@Mr.UB,Nirav D 是对的,问题是“如果值包含前缀”而不是“如果值以前缀开头”。这可能只是糟糕的措辞,但从技术上讲这是正确的答案。 (最好的答案......)
@Mr.UB 我想我现在也有明确的答案了,快乐编码:)【参考方案2】:
为了更明确地说明您正在进行的比较类型,我将使用 hasPrefix
或 range
方法:
import Foundation
let foo = "test"
let arrayValues = ["Testy", "tester", "Larry", "testing", "untested"]
// hasPrefix is case-sensitive
let filterArray = arrayValues.filter
$0.hasPrefix(foo)
print(filterArray) // -> "["tester", "testing"]\n"
/* Range can do much more, including case-insensitive.
The options [.anchored, .caseInsensitive] mean the search will
only allow a range that starts at the startIndex and
the comparison will be case-insensitive
*/
let filterArray2 = arrayValues.filter
// filters the element if foo is not found case-insensitively at the start of the element
$0.range(of: foo, options: [.anchored, .caseInsensitive]) != nil
print(filterArray2) // -> "["Testy", "tester", "testing"]\n"
【讨论】:
这很有意义!谢谢 我在示例中添加了方法hasPrefix
,以显示简单的区分大小写的比较。
这应该是正确的答案。除了$0
将是!$0.
没有正确的答案,只有不同的方式来实现你的目标。我同意这个比其他一些解决方案更具表现力,并且具有您不必滚动自己的前缀检测代码的优势。依赖库和框架方法是个好主意,因为它们已经被使用、测试过,并且希望已经解决了错误!
我在我的代码中发现了一个错误,如果被测试的前缀和字符串都有一个共同的前缀,而不是被测试的整个前缀,那么它仍然是正确的。例如,“testeroo”和“testing”都有一个前缀“test”。我更改为range(of:options:range:locale)
以消除此错误。以上是关于如何遍历数组并根据字符串值删除项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章
我的 for 循环没有根据条件删除数组中的项目? Python [重复]
2021-06-12:已知一棵搜索二叉树上没有重复值的节点,现在有一个数组arr,是这棵搜索二叉树先序遍历的结果。请根据arr生成整棵树并返回头节点。