Java 无POJO,在rutime中构建复合比较器,用于多级排序

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

已经发布的问题并没有我的解决方案,因为所有其他解决方案都使用POJO字段进行排序,但case不是POJO,因为请求/响应是动态json,所以发布 我需要执行多级[具有多个属性]排序。 多个属性的排序来自输入请求的动态

 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传递给它,然后创建执行此操作的动态代码。此外,如果只有字段名作为字符串,则必须使用反射来获取字段的值

我写了一个例子,请注意:

  • 我不知道您使用的是哪个Json库,我在示例中使用了GSON
  • 有一些方法可以使用反射,我使用了较短的方法,但请参考以获得您的首选方法。如果您知道值的范围并希望避免反射,也可以使用switch case
  • 我留了两个待办事项
  • 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传递给它,然后创建执行此操作的动态代码。此外,如果只有字段名作为字符串,则必须使用反射来获取字段的值

    我写了一个例子,请注意:

  • 我不知道您使用的是哪个Json库,我在示例中使用了GSON
  • 有一些方法可以使用反射,我使用了较短的方法,但请参考以获得您的首选方法。如果您知道值的范围并希望避免反射,也可以使用switch case
  • 我留了两个待办事项
  • 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"
         }
      }
     ]
    }