如何使用部分数字内容对String列表进行排序?

时间:2015-12-12 16:51:07

标签: java string sorting arraylist

我正在尝试对ArrayList<String>进行排序。列表中的字符串看起来像这个"abc 123 def 456",我想对列表进行排序,使得具有最小最后一个数字的字符串首先出现,例如如果元素是

{"abc 123 def 456", "ghi 456 jkl 789", "mno 101 pqr 112"}

然后我希望排序列表首先包含第三个String,然后是第一个String,然后是第二个String。

{"mno 101 pqr 112", "abc 123 def 456","ghi 456 jkl 789"}

就像这样。

我尝试使用list.split(" ")Double.parseDouble(String)Collections.sort(list)对其进行排序,但我现在不知道如何将我的其余字符串与排序列表正确连接号。

编辑:

String[] numbers = list.get(i).split(" ");
numberList.add(Integer.parseInt(numbers[3]));
Collections.sort(numberList);

现在我知道数字应该如何排序,但是我不能将它们与其他字符串&#34;重新连接起来。

2 个答案:

答案 0 :(得分:2)

使用自定义Comparator的简单解决方案:

String[] arr = {"abc 123 def 456", "ghi 456 jkl 789", "mno 101 pqr 112"};

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return getLastNum(o1) - getLastNum(o2);
    }

    private int getLastNum(String s) {
        String[] tokens = s.split(" ");
        return Double.parseDouble(tokens[tokens.length - 1]);
    }
});

希望这段代码是自我解释的。

答案 1 :(得分:0)

如果所有格式都具有相同的格式,则解析String#split结果的最后一个字符串并比较这些值。

list.sort((s1, s2) -> {
    String[] split1 = s1.split("\\s+");
    String[] split2 = s2.split("\\s+");
    return Double.compare(
        Double.parseDouble(split1[split1.length - 1]),
        Double.parseDouble(split2[split2.length - 1]);
});

或者@JBNizet建议:

list.sort(Comparator.comparingDouble(s -> Double.parseDouble(s.substring(s.lastIndexOf(' ') + 1))));