我需要開發一個簡單的應用程式來根據預定義的規則對資料進行排序和選擇。應用程式必須能夠處理任意結構的物件的 JSON 串列,選擇包含具有特定值的鍵的物件,并使用自然排序順序按值對物件進行排序。
我使用“包含”規則創建了一個應用程式,該規則接受一組鍵:值對來檢查條目是否匹配。我該如何排序?
static class DataJSON{
public condition condition;
public ArrayList<data> data;
public class exclude{
public String name;
public Integer rating;
public Boolean disabled;
public String user;
}
public class include{
public String name;
public Integer rating;
public Boolean disabled;
public String user;
}
public class data{
public Boolean disabled;
public Integer rating;
public String user;
public String name;
}
public class condition{
public ArrayList<exclude> exclude;
public ArrayList<include> include;
public ArrayList<String> sort_by;
}
}
static class resultPrepare{
public Boolean disabled;
public Integer rating;
public String user;
public String name;
public resultPrepare(Boolean disabled, Integer rating, String user, String name){
this.disabled = disabled;
this.rating = rating;
this.user = user;
this.name = name;
}
}
static class DataResult{
//public Test.result result;
public static ArrayList<result> result;
public DataResult(ArrayList<result> result){
this.result = result;
}
}
public static class result{
public Boolean disabled;
public Integer rating;
public String user;
public String name;
public result(Boolean disabled, Integer rating, String user, String name){
this.disabled = disabled;
this.rating = rating;
this.user = user;
this.name = name;
}
}
public static void main(String[] args){
String json = "{\"data\": [{\"user\": \"[email protected]\", \"rating\": 20, \"disabled\": false, \"name\": \"Ton1\"},\n"
"{\"user\": \"[email protected]\", \"rating\": 14, \"disabled\": false, \"name\": \"Ton\"},\n"
"{\"user\": \"[email protected]\", \"rating\": 25, \"disabled\": false, \"name\": \"T\"}],\n"
"\"condition\": {\"include\": [{\"name\": \"Ton1\"}],\"exclude\": [{\"disabled\": false, \"name\": \"Tonf\"},{\"disabled\": false, \"name\": \"T\"}], \"sort_by\": [\"rating\"]}}";
Gson gson = new Gson();
DataJSON jsParse = gson.fromJson(json, DataJSON.class);
ArrayList<result> res = new ArrayList<result>();
for(int i = 0; i < jsParse.data.size(); i ){
Boolean flagInclude = false;
Boolean flagExclude = false;
Boolean flagExcludeDisabled = false;
if(jsParse.condition.include != null){
for(int j = 0; j < jsParse.condition.include.size(); j ){
if(jsParse.data.get(i).name != null && jsParse.condition.include.get(j).name != null){
if(jsParse.data.get(i).name.equalsIgnoreCase(jsParse.condition.include.get(j).name) || jsParse.condition.include.get(j).name == null){
if(jsParse.data.get(i).disabled == jsParse.condition.include.get(j).disabled || jsParse.condition.include.get(j).disabled == null){
if(jsParse.data.get(i).rating == jsParse.condition.include.get(j).rating || jsParse.condition.include.get(j).rating == null){
if((jsParse.data.get(i).user!= null && jsParse.condition.include.get(j).user != null)|| jsParse.condition.include.get(j).user == null){
if(jsParse.data.get(i).user.equalsIgnoreCase(jsParse.condition.include.get(j).user) || jsParse.condition.include.get(j).user == null){
flagInclude = true;
break;
}
}
}
}
}
}
}
}else{
flagInclude = true;
}
if(jsParse.condition.exclude != null){
for(int j = 0; j < jsParse.condition.exclude.size(); j ){
if(jsParse.data.get(i).name != null && jsParse.condition.exclude.get(j).name != null){
if(jsParse.data.get(i).name.equalsIgnoreCase(jsParse.condition.exclude.get(j).name) || jsParse.condition.exclude.get(j).name == null){
if(jsParse.data.get(i).disabled == jsParse.condition.exclude.get(j).disabled || jsParse.condition.exclude.get(j).disabled == null){
if(jsParse.data.get(i).rating == jsParse.condition.exclude.get(j).rating || jsParse.condition.exclude.get(j).rating == null){
if((jsParse.data.get(i).user!= null && jsParse.condition.exclude.get(j).user != null)|| jsParse.condition.exclude.get(j).user == null){
if(jsParse.data.get(i).user.equalsIgnoreCase(jsParse.condition.exclude.get(j).user) || jsParse.condition.exclude.get(j).user == null){
flagExclude = true;
break;
}
}
}
}
}
}
}
}else{
flagExclude = false;
}
System.out.println("flagInclude: " flagInclude " flagExclude: " flagExclude);
if(flagInclude == true && flagExclude == false){
result r = new result( jsParse.data.get(i).disabled, jsParse.data.get(i).rating , jsParse.data.get(i).user, jsParse.data.get(i).name );
res.add(r);
}
}
DataResult dataResult = new DataResult(res);
String jsParse2 = gson.toJson(dataResult.result);
String outJson = "{\"result\":" jsParse2 "}";
System.out.println(outJson);
}
}
輸出:"result":[{"disabled":false,"rating":20,"user":"[email protected]","name":"Ton1"}]}
uj5u.com熱心網友回復:
查看java Comparator介面和List介面的sort方法。有了它,您可以為“結果”類創建自定義比較器(順便說一句。類名應始終以大寫開頭)。
您的案例的名稱比較器示例。您需要實作缺少的那些,并根據您的規則集選擇使用哪一個。
// Add me somewhere in your code
public static class NameComparator implements Comparator<Result>
{
@Override
public int compare(Result o1, Result o2) {
return o1.name.compareTo(o2.name);
}
}
// And in the block where you output the json structure:
DataResult dataResult = new DataResult(res);
DataResult.result.sort(new NameComparator()); // <-- I am new
String jsParse2 = gson.toJson(dataResult.result);
String outJson = "{\"result\":" jsParse2 "}";
System.out.println(outJson);
希望這可以幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474644.html
上一篇:如何在Google表格的不同列中獲取每個唯一值的最大值?
下一篇:使用VBA的板載排序功能
