java比较包含深度嵌套列表的两个对象,根据列表a上的属性查找已删除的列表项,并更新列表b

mitkmikd  于 2021-06-27  发布在  Java
关注(0)|答案(0)|浏览(284)

给定具有以下示例结构的同一类t的两个示例a和b:

  1. Class T {
  2. Object C;
  3. Object D;
  4. List<E> listA;
  5. List<F> listB;
  6. .....
  7. }
  8. Where CLass E, Class F have also nested lists containing Objects etc.

列表中包含的所有对象都有一个bigdecimalseqnum属性,它表示列表中项目的序列号。
我想开发一种方法来比较两个示例a和b,如下所示: Compare all deeply nested lists of the two instances, find deleted list items from instance A and add them to the corresponding list in instance B with a negative seqNum 例子

  1. * Instance A* *Instance B* *Updated Instance B*
  2. List E List E List E
  3. 1 1 1
  4. 2 3 -2
  5. 3 5 3
  6. 4 -4
  7. 5 5
  8. Where 1,2,3,4,5 the seqNums of the objects contained in the list.

对于所有嵌套列表,以通用方式执行这种比较/更新的最佳方式是什么?
我曾考虑过将初始对象转换为json对象,并以这种方式进行比较/更新,但我想知道是否存在更优雅的解决方案。
以下是我使用jsonobjects更新的解决方案:

  1. public T intersectLists(T obj1, T obj2, Class<T> type){
  2. String obj1InString = new Gson().toJson(obj1);
  3. String obj2InString = new Gson().toJson(obj2);
  4. JsonParser parser = new JsonParser();
  5. JsonElement j1 = parser.parse(obj1InString);
  6. JsonElement j2 = parser.parse(obj2InString);
  7. compare(j1,j2);
  8. GsonBuilder gson = new GsonBuilder();
  9. return gson.create().fromJson(j2, type);
  10. }
  11. private void compare(JsonElement j1, JsonElement j2) {
  12. if (j1.equals(j2)) return;
  13. if (j1.isJsonArray() && j2.isJsonArray()) {
  14. JsonArray arrJ = (JsonArray) j1;
  15. JsonArray arrO = (JsonArray) j2;
  16. int size = Math.min(arrJ.size(), arrO.size());
  17. for (int i = 0; i < size; i++) {
  18. compare(arrJ.get(i), arrO.get(i));
  19. }
  20. if (arrJ.size() > arrO.size()) {
  21. JsonArray deletedElements = new JsonArray();
  22. for (int i = 0; i < arrJ.size(); i++) {
  23. JsonObject jsonObject = arrJ.get(i).getAsJsonObject();
  24. String sequenceNumeric = jsonObject.get("sequenceNumeric").getAsString();
  25. int j=0;
  26. boolean elementFound = false;
  27. while( j < arrO.size()) {
  28. JsonObject amendmentJsonObject = arrO.get(j).getAsJsonObject();
  29. String amendSequenceNumeric = amendmentJsonObject.get("sequenceNumeric").getAsString();
  30. if(amendSequenceNumeric.equals(sequenceNumeric)){
  31. elementFound = true;
  32. break;
  33. }
  34. j++;
  35. }
  36. if(!elementFound){
  37. jsonObject.remove("sequenceNumeric");
  38. jsonObject.addProperty("sequenceNumeric", -Integer.parseInt(sequenceNumeric));
  39. deletedElements.add(jsonObject);
  40. }
  41. }
  42. arrO.addAll(deletedElements);
  43. }
  44. } else if (j1.isJsonObject() && j2.isJsonObject()) {
  45. JsonObject objJ = (JsonObject) j1;
  46. JsonObject objO = (JsonObject) j2;
  47. for (Map.Entry<String, JsonElement> entry : objJ.entrySet()) {
  48. String key = entry.getKey();
  49. JsonElement value = entry.getValue();
  50. if (objO.has(key)) {
  51. compare(value, objO.get(key));
  52. }
  53. }
  54. }
  55. }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题