我的表格中有一列VALUE,其中包含:
`M_SYSCONFIG = 200600,2600000,700000600,110000600,150000600`
当我对此列表进行排序时,结果为:
110000600,150000600,110000600,200600,2600000,700000600
但是,我需要按如下方式对列表进行排序(将字符串视为整数):
200600,2600000,110000600,150000600,700000600
这是我现在用于对列表进行排序的代码:
JSONArray jsArray = dbcon.callSelectRecords("SELECT CODE, VALUE FROM M_SYSCONFIG WHERE MODULE = 'LIMIT_CONFIG' AND CODE in (?,?,?,?) ORDER BY VALUE", ft_other_cn, ft_own_account, payment, purchase);
for (int i = 0; i< jsArray.size(); i++) {
JSONObject js = JSON.newJSONObject(jsArray.get(i).toString());
String trasactionType = JSON.get(js, "CODE");
String value = JSON.get(js, "VALUE");
List<String> data = Arrays.asList(value.split(","));
Collections.sort(data);
我需要将结果作为字符串获取,因为在排序后我想要应用以下代码:
StringBuilder sbValue = new StringBuilder();
if(ft_other_cn.equals(trasactionType)) {
long limitOtherCimb = limit.getFtOtherCimbLimit();
sbValue.append(limitOtherCimb).append(",");
for(String values:data) {
Long limitSysConfig = null;
try {
limitSysConfig = Long.parseLong(values);
} catch (Exception e) {}
if(limitSysConfig == null) {
continue;
}
if(limitSysConfig > limitOtherCimb) {
continue;
}
sbValue.append(limitSysConfig).append(",");
}
customerLimit.setFtOtherCnLimit(StringUtils.removeEnd(sbValue.toString(), ","));
答案 0 :(得分:3)
您需要将字符串值转换为这样的整数,然后才需要排序。
JSONObject js = JSON.newJSONObject(jsArray.get(i).toString());
String trasactionType = JSON.get(js, "CODE");
String value = JSON.get(js, "VALUE");
List<String> data = Arrays.asList(value.split(","));
List<Integer> intList = new ArrayList<Integer>();
for(String s : data){
intList.add(Integer.valueOf(s));
}
Collections.sort(intList);
答案 1 :(得分:2)
我建议使用biginteger因为你的数字看起来很大。它不是最有效和最优化的解决方案,但它会起作用
public static List<String> sortData(List<String> data){
List<BigInteger>convertedData=new ArrayList<BigInteger>();
for (String s : data)
{
//System.out.println(s);
convertedData.add(new BigInteger(s));
}
Collections.sort(convertedData);
List<String>sortedData=new ArrayList<String>();
for (BigInteger b : convertedData)
{
sortedData.add(String.valueOf(b));
}
return sortedData;
}
您的代码:
JSONArray jsArray = dbcon.callSelectRecords("SELECT CODE, VALUE FROM M_SYSCONFIG WHERE MODULE = 'LIMIT_CONFIG' AND CODE in (?,?,?,?) ORDER BY VALUE", ft_other_cn, ft_own_account, payment, purchase);
for (int i = 0; i< jsArray.size(); i++) {
JSONObject js = JSON.newJSONObject(jsArray.get(i).toString());
String trasactionType = JSON.get(js, "CODE");
String value = JSON.get(js, "VALUE");
List<String> data = Arrays.asList(value.split(","));
List<String> sortedData=sortData(data); **<------**
答案 2 :(得分:1)
像这样实施一个比较器:
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return new Long(Long.parseLong(o1)).compareTo(Long.parseLong(o2));
}
});
答案 3 :(得分:1)
您可以学习java 8中引入的流。
只需在创建List后添加以下行,您就可以排序字符串列表
List<String> data = Arrays.asList(value.split(","));
data=data.stream().mapToLong(Long::parseLong).sorted().mapToObj(String::valueOf).collect(Collectors.toList());
如果数字非常大,可以使用BigInteger
data=data.stream().map(BigInteger :: new ).sorted().map(String::valueOf).collect(Collectors.toList());
如果您使用的是java 6,7,则必须使用Taher
中提到的比较器Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return new Long(Long.parseLong(o1)).compareTo(Long.parseLong(o2));
}
});
答案 4 :(得分:0)
您将数字排序为字符串 - 作为字符串,11在2之前。您需要先将字符串数组转换为数字,然后将它们排序为数字。
使用Streams API,您可以在一行上执行此操作:
String value = ...;
List<Long> data = Arrays.stream(value.split(",")).map(Long::new).sorted()
.collect(Collectors.toList());
因为你以后需要它们,我使用Long作为数字类型。
答案 5 :(得分:0)
如果您无法更改列表,那么最简单的方法是使用Java 8构建比较器并将字符串值用作大整数。您无需将字符串列表转换为数字列表。
List<String> list = Arrays.asList("200600,2600000,700000600,110000600,150000600".split(","));
list.sort(Comparator.comparing(item -> new BigInteger(item)));
System.out.println(list);
魔术发生在
之内Comparator.comparing(item -> new BigInteger(item))
通过这种方式,您构建了一个比较器(排序所需),用于比较转换为 BigIntegers 的所有项目。