Groovy中如何将不可变JSONArray转为移除指定元素的新JSONArray?
处理不可变JSONArray移除范围元素的优雅方案
因为原JSONArray是不可变的,所以必须生成新数组,以下两种Groovy方案比手动遍历插入更简洁:
方案一:利用Groovy集合范围拼接(推荐)
Groovy支持对列表/数组直接使用范围操作,把原JSONArray转成可操作的列表后,直接拼接保留的前后两段,再转回JSONArray:
// 定义要移除的起始和结束索引(均为包含) def startRemoveIdx = 5 def endRemoveIdx = 20 // 拆分并拼接保留的元素,再生成新的JSONArray def retainedElements = jsonArray[0..<startRemoveIdx] + jsonArray[endRemoveIdx+1..-1] def newJsonArray = new groovy.json.JsonArray(retainedElements) // 如果使用的是org.json.JSONArray,替换为: // def newJsonArray = new org.json.JSONArray(retainedElements)
0..<startRemoveIdx取原数组中从索引0到startRemoveIdx-1的所有元素endRemoveIdx+1..-1取原数组中从endRemoveIdx+1到最后一个元素的所有内容- 直接用
+拼接两个片段,得到保留的元素列表,再实例化新的JSONArray即可
方案二:利用JSONArray自带的subarray方法
如果使用的是org.json.JSONArray,可以用它自带的subarray方法拆分出需要保留的两段,再合并到新数组中:
def startRemoveIdx = 5 def endRemoveIdx = 20 // 拆分出前后两段保留的子数组 def firstPart = jsonArray.subarray(0, startRemoveIdx) def secondPart = jsonArray.subarray(endRemoveIdx + 1, jsonArray.length()) // 合并到新的JSONArray def newJsonArray = new org.json.JSONArray() firstPart.forEach { newJsonArray.put(it) } secondPart.forEach { newJsonArray.put(it) }
这两种方案都避免了手动遍历判断索引的冗余代码,利用Groovy语法特性或JSON库自带方法实现更简洁的逻辑。
内容的提问来源于stack exchange,提问作者HC LW
相关产品推荐
相关产品推荐

