使用Java中的Integer值对String列表进行排序

时间:2018-05-23 07:06:40

标签: java

我的表格中有一列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(), ","));

6 个答案:

答案 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 的所有项目。