我需要开发一个简单的应用程序,根据预定义的规则对数据进行排序和选择。该应用程序必须能够处理任意结构的对象的JSON列表,选择包含具有特定值的键的对象,并且还可以使用自然排序顺序按值对对象进行排序。
我创建了一个应用程序,它使用“include”规则来接受一组键:值对,以检查条目是否匹配。
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\": \"mike@mail.com\", \"rating\": 20, \"disabled\": false, \"name\": \"Ton1\"},\n" +
"{\"user\": \"greg@mail.com\", \"rating\": 14, \"disabled\": false, \"name\": \"Ton\"},\n" +
"{\"user\": \"john@mail.com\", \"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);
}
}
输出:“结果”:[{“禁用”:假,“评级”:20,“用户”:“mike@mail.com“,“名称”:“Ton 1”}]}
1条答案
按热度按时间wtzytmuj1#
查看java Comparator 接口和 List 接口的 sort 方法。通过它们,您可以为您的'result'类创建自定义比较器(顺便说一句,类名应该始终以大写字母开头)。
您的案例的名称比较器示例。您将需要实现缺少的比较器,并根据您的规则集选择要使用的比较器。
希望这对你有帮助。