Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用字符串列表的部分数字内容对其进行排序?_Java_String_Sorting_Arraylist - Fatal编程技术网

Java 如何使用字符串列表的部分数字内容对其进行排序?

Java 如何使用字符串列表的部分数字内容对其进行排序?,java,string,sorting,arraylist,Java,String,Sorting,Arraylist,我正在尝试对数组列表进行排序。列表中的字符串如下所示“abc 123 def 456”,我想对列表进行排序,以使最后一个数字最小的字符串排在第一位,例如,如果元素是 {"abc 123 def 456", "ghi 456 jkl 789", "mno 101 pqr 112"} 然后我希望排序后的列表首先有第三个字符串,然后是第一个字符串,然后是第二个字符串 {"mno 101 pqr 112", "abc 123 def 456","ghi 456 jkl 789"} 就这样 我尝试使用

我正在尝试对
数组列表进行排序。列表中的字符串如下所示
“abc 123 def 456”
,我想对列表进行排序,以使最后一个数字最小的字符串排在第一位,例如,如果元素是

{"abc 123 def 456", "ghi 456 jkl 789", "mno 101 pqr 112"}
然后我希望排序后的列表首先有第三个字符串,然后是第一个字符串,然后是第二个字符串

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

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

编辑:


现在我知道了数字应该如何排序,但我无法将它们与“字符串”的其余部分重新连接

如果所有的将具有相同的格式,则分析
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))));

使用自定义比较器的简单解决方案

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]);
    }
});
String[]arr={“abc 123 def 456”、“ghi 456 jkl 789”、“mno 101 pqr 112”};
sort(arr,新的比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回getLastNum(o1)-getLastNum(o2);
}
private int getLastNum(字符串s){
字符串[]标记=s.split(“”);
返回Double.parseDouble(令牌[tokens.length-1]);
}
});

希望这段代码是不言自明的。

向我们展示您的最佳尝试。不要使用Double.parseDouble()来解析整数。只需按最后一个数字排序,就不会强制分隔字符串的各个部分,所以不要这样做。为什么让你的生活更艰难?@JBNizet也许你可以解释一下用parseDouble解析整数的缺点是什么?我的实际字符串包含Double而不是整数,这就是我在这里编写Double.parseDouble()的原因@Peter Lawrey我希望字符串在排序后是相同的,只是在另一个顺序。我仍然可以按最后一个数字排序吗?Double.parseDouble()需要一个十进制数字,而您需要一个整数。因此,如果您正在解析的恰好是一个有效的double,那么它将愉快地返回一个值,尽管它应该只接受有效的整数。例如,parseDouble()将愉快地解析“1.23e7”,尽管这显然不是您所期望的,如果您实际解析的是“1.23e7”,则最好有一个异常,发出错误信号。如果需要一个整数,请使用Java 8解析一个整数。或者:
list.sort(Comparator.comparingDouble(s->Double.parseDouble(s.substring(s.lastIndexOf(“”)+1))。喜欢那些简单的一行程序。你的答案中混合了split1和split2:split2[split1.length-1]它们的顺序仍然错误。比较器按相反顺序排序。这是Comparator.comparing()的好处之一:您不会弄乱参数的顺序,因为您只有一个参数。我误读了这个问题,我(不知道为什么)认为OP在寻找逆序。恐怕我不太理解您的代码。什么是
String#split
?s1和s2呢?这些是列表中的字符串吗?
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]);
    }
});