簡體   English   中英

JSONArray中的唯一JSONObjects

[英]Unique JSONObjects in JSONArray

我有一個JSONArray,其中包含一組JSONObjects。 從中獲取唯一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集合,該集合僅維護唯一的對象,而不維護數組。

所以是HashSetTreeSet或類似的東西。 那你可以

  1. 在插入之前,請在插入之前檢查集合是否存在對象,然后根據需要對其進行處理。
  2. 插入現有對象並將其替換為新對象

請記住,對象的比較將需要您在Class中創建自己的equals()比較(當然,您還需要覆蓋hashcode()

另請參閱: 防止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();
    }

當然,通過這種方式,我無法控制保留哪個對象。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM