Java 无POJO,在rutime中构建复合比较器,用于多级排序
已经发布的问题并没有我的解决方案,因为所有其他解决方案都使用POJO字段进行排序,但case不是POJO,因为请求/响应是动态json,所以发布 我需要执行多级[具有多个属性]排序。 多个属性的排序来自输入请求的动态Java 无POJO,在rutime中构建复合比较器,用于多级排序,java,Java,已经发布的问题并没有我的解决方案,因为所有其他解决方案都使用POJO字段进行排序,但case不是POJO,因为请求/响应是动态json,所以发布 我需要执行多级[具有多个属性]排序。 多个属性的排序来自输入请求的动态 Have created individual Comparator for each dataTypes like String,Numeric, etc e、 g.积分比较器 public class IntegerComparator implements <DTO
Have created individual Comparator for each dataTypes like String,Numeric, etc
e、 g.积分比较器
public class IntegerComparator implements <DTOObject> {
@Override
public int compare(DTOObject o1, DTOObject o2){
return o1.getAccountID()-o2.getAccountID();
}
} //since my json response is dynamic. getter method is framed
dynamically based on input request tells which parameter to sort.
注意:排序属性是动态的,最多为1。。。N参数
样本响应:-
"ResponseObject":{
"documents": [
{
"DETAIL":[
{"CUSTID":"789"},
{"ACCT":"SAV"},
{"AGE":"22"}
],
"SRC": {
"SYSTEM":"IB",
"TITLE":"PEM"
},
"SYSDATA":{
"NAME":"MATT"
}
},
{
"DETAIL":[
{"CUSTID":"522"},
{"ACCT":"CUR"},
{"AGE":"40"}
],
"SRC": {
"SYSTEM":"IB",
"TITLE":"CON"
},
"SYSDATA":{
"NAME":"JAMES"
}
}
]
}
我想不出一个简单的方法来做这件事。您必须创建
Comparator
并将要排序的属性的json传递给它,然后创建执行此操作的动态代码。此外,如果只有字段名作为字符串,则必须使用反射来获取字段的值
我写了一个例子,请注意:
import com.google.gson.JsonArray;
导入com.google.gson.JsonElement;
导入com.google.gson.JsonObject;
导入java.lang.reflect.Field;
导入java.util.Comparator;
公共类MyComperator实现了Comparator{
私人JsonArray参数;
公共mycomperator(JsonArray参数){
this.params=params;
//TODO:如果需要,可以按“顺序”对参数进行排序
}
@凌驾
公共整数比较(DTOObject o1,DTOObject o2){
对于(int i=0;i
我想不出一个简单的方法来做到这一点。您必须创建Comparator
并将要排序的属性的json传递给它,然后创建执行此操作的动态代码。此外,如果只有字段名作为字符串,则必须使用反射来获取字段的值
我写了一个例子,请注意:
import com.google.gson.JsonArray;
导入com.google.gson.JsonElement;
导入com.google.gson.JsonObject;
导入java.lang.reflect.Field;
导入java.util.Comparator;
公共类MyComperator实现了Comparator{
私人JsonArray参数;
公共mycomperator(JsonArray参数){
this.params=params;
//TODO:如果需要,可以按“顺序”对参数进行排序
}
@凌驾
公共整数比较(DTOObject o1,DTOObject o2){
对于(int i=0;i
可能重复的@Mantanper的可能重复。我没有POJO,因为我的反应总是动态的。。所以我不能使用这个DTOObject.class.getDeclaredField(fieldName)类类型也不能在任何地方使用?你能告诉我吗。我们有没有办法用泛型方法来处理所有数字数据类型[int、float、double]和一个for string,而不是创建多个方法或classess???@Manu您在帖子中使用了DTOObject
,这将非常容易
public class AccountService {
public SearchResponse accountFetch(){
//To do
List <JSONObject> resultList= someObject.fetchAcoount("12345678");
// the resultList is dynamic JSON reponse,
so no setter/getter method cannot be created
Collections.sort(resultList, new IntegerComparatorimplements ());
// how to invoke multi level sorting here as sorting attributes are
dynamic and upto N parameters
}
}
{
{
"RequestOject":{
"CUSTID": "100"
},
"responseParameters":[
{
"name":"NAME",
"datatype":"String",
"order":"asc",
"sequence":1
},
{
"name":"SYSTEM",
"datatype":"int",
"order":"asc",
"sequence":2
},
{
"name":"AGE",
"datatype":"int",
"order":"desc",
"sequence":4
},
{
"name":"TITLE",
"datatype":"String",
"order":"desc",
"sequence":3
},
upto... N parameters
]
}
}
"ResponseObject":{
"documents": [
{
"DETAIL":[
{"CUSTID":"789"},
{"ACCT":"SAV"},
{"AGE":"22"}
],
"SRC": {
"SYSTEM":"IB",
"TITLE":"PEM"
},
"SYSDATA":{
"NAME":"MATT"
}
},
{
"DETAIL":[
{"CUSTID":"522"},
{"ACCT":"CUR"},
{"AGE":"40"}
],
"SRC": {
"SYSTEM":"IB",
"TITLE":"CON"
},
"SYSDATA":{
"NAME":"JAMES"
}
}
]
}