【问题标题】:Unique JSONObjects in JSONArrayJSONArray 中的唯一 JSONObjects
【发布时间】:2016-11-07 22:35:30
【问题描述】:

我有一个 JSONArray,其中包含一组 JSONObject。从

获取唯一 JSONObjects 的最佳算法是什么
"lessaon_plan_data": [
      {
        "lessonplan_marks": 100,
        "lessonplan_name": "wdwd",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 50,
        "lessonplan_name": "ewewd",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 8,
        "lessonplan_name": "qwefqwef",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 20,
        "lessonplan_name": "qwefqwef",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 4,
        "lessonplan_name": "qwefqwef",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 8,
        "lessonplan_name": "qwefqwef",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 20,
        "lessonplan_name": "qwefqwef",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 4,
        "lessonplan_name": "qwefqwef",
        "lessonplan_subject": "Maths"
      },
      {
        "lessonplan_marks": 8,
        "lessonplan_name": "qwefqwef",
        "lessonplan_subject": "Maths"
      }
    ]

我试过的是这样的:

private JSONArray removeDuplicate(JSONArray rubricReportArray) {
    Log.e("MethodEntered", "success");
    JSONArray tempArray = new JSONArray();
    try {
        JSONObject tempStudentObj = null;
        for (int i = 0; i < rubricReportArray.length(); i++) {
            JSONObject studentObj = rubricReportArray.getJSONObject(i);


            tempStudentObj = new JSONObject();
            tempStudentObj.put("student_name", studentObj.getString("student_name"));
            tempStudentObj.put("lessonplan_name", studentObj.getString("lessonplan_name"));
            tempStudentObj.put("student_id", studentObj.getString("student_id"));
            tempStudentObj.put("lessonplan_subject", studentObj.getString("lessonplan_subject"));
            tempStudentObj.put("student_marks", studentObj.getString("student_marks"));
            tempStudentObj.put("lessonplan_class", studentObj.getString("lessonplan_class"));


            JSONArray duplicateArray = studentObj.getJSONArray("lessaon_plan_data");
            JSONArray uniqueArray = new JSONArray();
            Map<String,String> uniqueMap = new HashMap<>();

            for (int j = 0; j < duplicateArray.length(); j++) {
                boolean flag = false;
                String lessonMarks = duplicateArray.getJSONObject(j).getString("lessonplan_marks");
                String lessonName = duplicateArray.getJSONObject(j).getString("lessonplan_name");
                String lessonSubject = duplicateArray.getJSONObject(j).getString("lessonplan_subject");
                for (int k = j + 1; k < duplicateArray.length() - 1; k++) {
                    String currentLessonMarks = duplicateArray.getJSONObject(k).getString("lessonplan_marks");
                    String currentLessonName = duplicateArray.getJSONObject(k).getString("lessonplan_name");
                    String currentLessonSubject = duplicateArray.getJSONObject(k).getString("lessonplan_subject");
                    if (!lessonSubject.equalsIgnoreCase(currentLessonSubject)) {
                        uniqueArray.put(duplicateArray.getJSONObject(j));
                        break;
                    } else if (!lessonName.equalsIgnoreCase(currentLessonName)) {
                        flag = false;
                        uniqueArray.put(duplicateArray.getJSONObject(j));
                        break;
                    } else {
                        if (!lessonMarks.equalsIgnoreCase(currentLessonMarks)) {
                            flag = true;
                        }
                    }
                }
                if (flag) {
                    uniqueArray.put(duplicateArray.getJSONObject(j));
                }
                //Log.e("Unique JSON",set.toString());
            }
            tempStudentObj.put("lessaon_plan_data", uniqueArray);
            Log.e("TempStudent", tempStudentObj.toString());
            tempArray.put(tempStudentObj);

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return tempArray; //assign temp to original

}

我得到了独特的对象,其中有独特的主题和课程。但是当相同的课程,相同的科目,但分数不同时,问题就来了。

如何从中获取唯一的 JSONObjects 并将其存储在新的或替换相同的 JSONArray 中? 我已经尝试了stackoverflow中的大多数解决方案。 但在我的情况下没有任何效果。 请帮忙。 提前致谢

【问题讨论】:

  • 显示你的代码,你做了什么?
  • 我更新问题请检查。
  • 更正了您的代码并作为答案发布。请检查

标签: java android json


【解决方案1】:

不清楚您做了什么或如何存储对象。

但如果您还没有,那么我的建议是使用只维护唯一对象而不是数组的 Java 集合。

所以HashSetTreeSet 或类似的东西。然后你可以;

  1. 在插入之前,在插入之前检查集合是否存在对象,然后根据需要进行处理。
  2. 插入现有对象并将其替换为新对象

请记住,对象的比较需要您在 Class 中创建自己的 equals() 比较(当然您还需要覆盖 hashcode()

另请参阅:Prevent duplicate entries in arraylist

更新:

我使用 Gson 来解码我的 json,以下只给了我 3 个唯一条目;

Gson gson = new Gson();
Type listType = new TypeToken<HashSet<LessonPlan>>(){}.getType();
Set<LessonPlan> lpList = new Gson().fromJson(json, listType);

课程计划课

public class LessonPlan {
    private int lessonplan_marks;
    private String lessonplan_name;
    private String lessonplan_subject;

    public int getLessonplan_marks() {
        return lessonplan_marks;
    }

    public void setLessonplan_marks(int lessonplan_marks) {
        this.lessonplan_marks = lessonplan_marks;
    }

    public String getLessonplan_name() {
        return lessonplan_name;
    }

    public void setLessonplan_name(String lessonplan_name) {
        this.lessonplan_name = lessonplan_name;
    }

    public String getLessonplan_subject() {
        return lessonplan_subject;
    }

    public void setLessonplan_subject(String lessonplan_subject) {
        this.lessonplan_subject = lessonplan_subject;
    }

    public LessonPlan() {


    }

    public String toString()
    {
        return "Name: " + this.getLessonplan_name() + " subject: " + this.getLessonplan_subject() + " marks: " + this.getLessonplan_marks();
    }


    public boolean equals(Object obj)
    {
        if (obj instanceof LessonPlan)
        {
            LessonPlan other = (LessonPlan)obj;
            if (other.getLessonplan_name().equals(this.getLessonplan_name()) && other.getLessonplan_subject().equals(this.getLessonplan_subject()))
                return true;
            else
                return false;
        }
        else
            return false;
    }

    public int hashCode()
    {
        return this.getLessonplan_name().hashCode() + this.getLessonplan_subject().hashCode();
    }

当然,这样做我无法控制保留哪些对象。

【讨论】:

  • 我已经用我尝试过的方法更新了这个问题。我只想删除重复的 JSONObjects 就是这样。 JSONObject 中的所有属性都应该是唯一的
  • 我仍然认为处理 Java 集合是更好的方法。从 JSON 转换为 obecjst​​,查找并删除重复项,然后再转换回 JSON。
  • 还是没有成功。
  • 我非常感谢您的努力..但我得到了我的解决方案。即使我会试一试。非常感谢您的帮助
【解决方案2】:
private JSONArray removeDuplicate(JSONArray rubricReportArray) throws Exception{
        Log.e("MethodEntered", "success");
        JSONArray tempArray = new JSONArray();
        try {
            JSONObject tempStudentObj = null;
            for (int i = 0; i < rubricReportArray.length(); i++) {
                JSONObject studentObj = rubricReportArray.getJSONObject(i);


                tempStudentObj = new JSONObject();
                tempStudentObj.put("student_name", studentObj.getString("student_name"));
                tempStudentObj.put("lessonplan_name", studentObj.getString("lessonplan_name"));
                tempStudentObj.put("student_id", studentObj.getString("student_id"));
                tempStudentObj.put("lessonplan_subject", studentObj.getString("lessonplan_subject"));
                tempStudentObj.put("student_marks", studentObj.getString("student_marks"));
                tempStudentObj.put("lessonplan_class", studentObj.getString("lessonplan_class"));


                JSONArray duplicateArray = studentObj.getJSONArray("lessaon_plan_data");
                JSONArray uniqueArray = new JSONArray();
                int k;
                for (int j = 0; j < duplicateArray.length(); j++) {
                    boolean flag = false;
                    String lessonMarks = duplicateArray.getJSONObject(j).getString("lessonplan_marks");
                    String lessonName = duplicateArray.getJSONObject(j).getString("lessonplan_name");
                    String lessonSubject = duplicateArray.getJSONObject(j).getString("lessonplan_subject");
                    for (k = j + 1; k < duplicateArray.length() - 1; k++) {

                        String currentLessonMarks = duplicateArray.getJSONObject(k).getString("lessonplan_marks");
                        String currentLessonName = duplicateArray.getJSONObject(k).getString("lessonplan_name");
                        String currentLessonSubject = duplicateArray.getJSONObject(k).getString("lessonplan_subject");

                        if (lessonMarks.equalsIgnoreCase(currentLessonMarks) && (lessonSubject.equalsIgnoreCase(currentLessonSubject) &&
                                lessonName.equalsIgnoreCase(currentLessonName) 
                               ){
                            break;
                        }


                    }
                    if (k == duplicateArray.length() - 1){
                        uniqueArray.put(duplicateArray.getJSONObject(j));
                    }
                }
                tempStudentObj.put("lessaon_plan_data", uniqueArray);
                Log.e("TempStudent", tempStudentObj.toString());
                tempArray.put(tempStudentObj);

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return tempArray; //assign temp to original

    }

参考:- 用于从数组中查找唯一元素的基本算法 http://www.techcrashcourse.com/2015/08/c-program-print-unique-elements-unsorted-array.html

【讨论】:

  • 我试过了,但没有成功。并且“k”甚至不在范围内。您已经检查了 for 循环外的条件。而for循环中的“if”条件总是会中断,因为这里所有的科目都是数学。
  • 编辑了我的答案,检查完整的代码。即使主题相同,名称和标记也不同。代码将检查所有三个值是否唯一。
  • 您的解决方案仅适用于这组测试用例。当只有一个 JSONObject 或 2 个 JSONObject 时,它不能正常工作。请帮忙。
  • 请检查此链接techcrashcourse.com/2015/08/… 并调试您的程序。链接上给出的解决方案适用于所有数组(即使数组大小为 2)。
  • 效果很好。实际上,您的代码需要进行一些更改,并且它在每种情况下都能正确运行。再次感谢队友的快速回复。拯救了我的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 2018-10-16
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多