如何遍历数组并根据字符串值删除项目[重复]

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) 

编辑:我有 filtercontains 的数组,因为 OP 用 contains 提出了问题,但由于某种原因,其他人认为这是错误的答案。所以现在我要添加filterhasPrefix

var filterArray = arrayValues.filter  !$0.lowercased().hasPrefix(prefixValue) 

【讨论】:

欢迎朋友 :) 这将过滤包含reh的字符串。 @Mr.UB 我已经根据操作问题给出了答案,这就是我使用包含的原因。 @Mr.UB,Nirav D 是对的,问题是“如果值包含前缀”而不是“如果值以前缀开头”。这可能只是糟糕的措辞,但从技术上讲这是正确的答案。 (最好的答案......) @Mr.UB 我想我现在也有明确的答案了,快乐编码:)【参考方案2】:

为了更明确地说明您正在进行的比较类型,我将使用 hasPrefixrange 方法:

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生成整棵树并返回头节点。

如何在 React JSX 中循环遍历数组中的某些项目 [重复]

遍历二维数组并将值放入映射 [重复]

js遍历数组重复值和数组中对象重复值