我正在尝试对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;重新连接起来。
答案 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))));