[英]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集合,該集合僅維護唯一的對象,而不維護數組。
所以是HashSet
, TreeSet
或類似的東西。 那你可以
請記住,對象的比較將需要您在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.