美文网首页
Java 对象多字段动态排序

Java 对象多字段动态排序

作者: 步闲 | 来源:发表于2019-12-05 19:04 被阅读0次
import com.xcar.hbase.common.pojo.RowData;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class CompareFunction implements Comparator<RowData> {
    private List<String> list;

    public CompareFunction(List<String> list) {
        this.list = list;
    }

    @Override
    public int compare(RowData o1, RowData o2) {
        List<Integer> ss = new ArrayList<>();
        for (String k : list) {
            String[] split = k.split(":");
            String field = split[0];
            String sort = split[1];
            String type = split[2];
            int res;
            String s1 = o1.getKeyValues().getOrDefault(field, null);
            String s2 = o2.getKeyValues().getOrDefault(field, null);

            if (StringUtils.isBlank(s1) && !StringUtils.isBlank(s2)) {
                return 1;
            } else if (!StringUtils.isBlank(s1) && StringUtils.isBlank(s2)) {
                return -1;
            } else if (StringUtils.isBlank(s1) && StringUtils.isBlank(s2)) {
                return 0;
            } else {
                if ("int".equals(type)) {
                    res = Integer.valueOf(s1) - Integer.valueOf(s2);
                } else if("long".equals(type)){
                    long l = Long.valueOf(s1) - Long.valueOf(s2);
                    if(l<0){
                        res=-1;
                    }else if(l>0){
                        res=1;
                    }else {
                        res=0;
                    }
                }else if("double".equals(type)){
                    double v = Double.valueOf(s1) - Double.valueOf(s2);
                    if(v<0){
                        res=-1;
                    }else if(v>0){
                        res=1;
                    }else {
                        res=0;
                    }
                } else {
                    res = o1.getKeyValues().get(field).compareTo(o2.getKeyValues().get(field));
                }
            }
            if ("desc".equals(sort)) {
                res = -res;
            }
            ss.add(res);
        }
        for (Integer f : ss) {
            if (f > 0) {
                return 1;
            } else if (f < 0) {
                return -1;
            }
        }
        return 0;
    }
}

调用:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RowData {
    String rowkey;
    Map<String,String> keyValues;
}
public List<RowData> formatData(List<RowData> rowDataList,BigShip bigShip){

        JSONArray sort = bigShip.getSort();
        if(!sort.isEmpty()){
            List<String> list = sort.toJavaList(String.class);
            rowDataList.sort(new CompareFunction(list));
        }
        return rowDataList;
    }

相关文章

网友评论

      本文标题:Java 对象多字段动态排序

      本文链接:https://www.haomeiwen.com/subject/pldjgctx.html