目录
一、前言
二、解决方法
第一种方法是在jvm启动参数中加上配置
第二种方法是在代码中实现
java实现代码
一、前言
java实现排序的时候,有时候会出现异常java.lang.IllegalArgumentException: Comparison method violates its general contract,
报这个异常的原因是代码里没有考虑对象o1和对象o2为Null的情况,
即当o1与o2都为null时两者大小如何判定呢;
当o1为null但o2不为null时两者大小又如何判定了呢,
同理当o2为null但o1不为null时两者大小又如何判定呢
所以代码里没有考虑上述情况的时候,就会出现Comparison method violates its general contract 异常了。
那怎么解决呢?
二、解决方法
第一种方法是在jvm启动参数中加上配置
-Djava.util.Arrays.useLegacyMergeSort=true
原因是因为JDK7中的Collections.Sort方法实现中,如果两个值是相等的,那么compare方法需要返回0,否则 可能 会在排序时抛错,而JDK6是没有这个限制的。
第二种方法是在代码中实现
下面分享一下我,java手把手实现数据库的排序规则
当有多个字段排序的时候,优先以第一个字段排序,如果第一个字段分出顺序就不考虑后面的字段;如果第一个字段相等,就再进行第二个字段的排序,以此类推
eg:a desc,b asc
数据库中表示先以a字段倒序排序,如果a字段拍出顺序,就不再进行排序,如果a字段值相等,就以 b字段升序排序。
java怎么实现上述功能呢?
java实现代码
我们先定义规则:
可以传入排序规则,多个规则用英文逗号分隔,冒号后面跟num还是text表示是用数字排序还是用字符串排序;如果冒号后面不跟num或者text,默认用字符串排序
eg:a.asc:num,b.desc,c.asc:text
表示a字段用数字类型升序排序,如果相等再用b字段字符串倒序排序,最后用c字段字符串升序排序
实现数据库排序的代码如下
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
public class Testaaa {
/**
* 大于SORT_SIZE要排序
*/
static Integer SORT_SIZE = 1;
/**
* 倒序排序
*/
static String SORT_DESC = "desc";
/**
* 合并计算方式
*/
static String COMBINECALC_FLAG = "1";
/**
* 该字段属于什么类型,数字还是字符串
*/
static String TEXT_TYPE = "num";
/**
* 绝对值
*/
static String TEXT_TYPE_ABS = "abs";
/**
* 冒号分隔符
*/
static String COLON_SEPARATOR = ":";
public static void main(String[] args) {
List
运行结果: