
对最佳回答进行修改,假设原始Json数组是这样的
原始JSONArry:[{"Value":"15153129877","Key":"09770985-9869-11e7-9c0d-fa163ef28f43"},{"Value":"15153129877","Key":"09770985-9869-11e7-9c0d-fa163ef28f43"}]
工具类如下:
/*** 根据Key去重复
* @param array
*/
public static JSONArray delRepeatIndexid(JSONArray array) {
JSONArray arrayTemp = new JSONArray()
int num = 0
for(int i = 0i < array.size()i++){
if(num==0){
arrayTemp.add(array.get(i))
}else{
int numJ = 0
for(int j = 0j < arrayTemp.size() j++){
JSONObject newJsonObjectI = (JSONObject)array.get(i)
JSONObject newJsonObjectJ = (JSONObject)arrayTemp.get(j)
String index_idI = newJsonObjectI.get("Key").toString()
String valueI = newJsonObjectI.get("Value").toString()
String index_idJ = newJsonObjectJ.get("Key").toString()
if(index_idI.equals(index_idJ)){
arrayTemp.remove(j)
JSONObject newObject = new JSONObject()
newObject.put("Key", index_idI)
newObject.put("Value", valueI)
arrayTemp.add(newObject)
break
}
numJ++
}
if(numJ-1 == arrayTemp.size()-1){
arrayTemp.add(array.get(i))
}
}
num++
}
return arrayTemp
}
处理结果
数据处理后JSONArry:[{"Value":"15153129877","Key":"09770985-9869-11e7-9c0d-fa163ef28f43"}]
完毕!!!!
需求:如果nodeArray中包含了deptType和roleId完全相同的对象,则判断为重复
方法:
但是上述方法所用的循环太多,一旦数组过大,算法复杂度太高,效率低。由于只要判断出当前数组中是否有重复对象,将每一个对象中的value取出,拼成的字符串肯定是唯一的,将获取的字符串存到一个新的对象中,如果新对象中包含此字符串,则重复;否则,继续循环原数组去取下一个对象拼成的字符串...
let nodeArray = [
{deptType: 1, roleId: 10},
{deptType: 1, roleId: 1000},
{deptType: 1, roleId: 100},
{deptType: 2, roleId: 1000},
{deptType: 2, roleId: 1000}
]
function verfiyNode(data) {
let map = {}
for(var i = 0i <data.lengthi++) {
let key = data[i].deptType + '-' + data[i].roleId
let value = map[key]
if (value) {
return false
}
map[key] = key
}
return true
}
要判断json数据的字段与其他数据是否相同,那么肯定是要先解析json数据。解析json数据的方式很多,Gson、FastJson都是很简便实用的工具。这里以Gson为例。
import java.lang.reflect.Typeimport java.util.*
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
public class Divination {
public static void main(String[] args) {
String jsonStr = "[{\"depid\":\"5\",\"score\":\"10\"},{\"depid\":\"4\",\"score\":\"40\"},{\"depid\":\"4\",\"score\":\"30\"},{\"depid\":\"5\",\"score\":\"30\"}]"
System.out.println("原始的json字符串:" + jsonStr)
// 解析
Gson gson = new Gson()
Type type = new TypeToken<ArrayList<JsonData>>() {
}.getType()
ArrayList<JsonData> list = gson.fromJson(jsonStr, type)
// 合并
List<JsonData> ordered = new ArrayList<>()
Map<Integer, JsonData> map = new HashMap<>()
for (JsonData jsonData : list) {
JsonData data = map.get(jsonData.getDepid())
if (data != null) { // depid相同的合并score字段
data.setScore(data.getScore() + jsonData.getScore())
} else {
map.put(jsonData.getDepid(), jsonData)
ordered.add(jsonData)
}
}
// 还原为json字符串
System.out.println("合并后json字符串:" + gson.toJson(map.values()))
System.out.println("合并后json字符串(按原来的顺序):" + gson.toJson(ordered))
}
}
class JsonData {
private int depid
private int score
public int getDepid() {
return depid
}
public void setDepid(int depid) {
this.depid = depid
}
public int getScore() {
return score
}
public void setScore(int score) {
this.score = score
}
}
以上代码中List<JsonData>ordered = new ArrayList<>()是为了按原json数组的顺序输出合并后的结果,如果对顺序无要求可以删除相关代码。
运行结果:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)