Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting_Collections_Java 8 - Fatal编程技术网

Java 排序双大十进制数的更好方法

Java 排序双大十进制数的更好方法,java,sorting,collections,java-8,Java,Sorting,Collections,Java 8,我有字符串列表,希望对值进行排序 List<String> list = new ArrayList<String>(); list.add("200.1043725170"); list.add("100.1043725171"); list.add("100.1043725170"); list.add("65535.4294967295"); list.add("4294967

我有字符串列表,希望对值进行排序

List<String> list = new ArrayList<String>();
list.add("200.1043725170");
list.add("100.1043725171");
list.add("100.1043725170");
list.add("65535.4294967295");
list.add("4294967295.65535");
使用上述方法,值是排序的,但最后的零不会在(.)之后打印,因为它被认为不相关。但我也需要有尾随的零,因为我们在其他地方比较这些值

我想要的最终输出是

100.1043725170
100.1043725171
200.1043725170
65535.4294967295
4294967295.65535
这里有什么建议可以通过有效的方法达到同样的效果

更新 最好的解决方案是,非常简短的一行代码。下面是我的两种方法。虽然不那么简洁,但我将把它们留在这里,因为它们可能会让读者感兴趣

避免双倍 代码将字符串转换为
double
double
值。这样做会引入固有的技术。如果您关心准确性,请避免这种情况

相反,直接将输入字符串解析为
BigDecimal
对象

转换为
BigDecimal
您必须将字符串直接解析为
BigDecimal
。将这些对象收集到列表中。分类然后通过为每个
BigDecimal
生成新的字符串值,生成一个新的
String
对象列表。这些步骤中的每一步都已经在堆栈溢出上讨论了很多次。搜索以了解更多信息

NavigableMap
或者,使用
SortedMap
/
NavigableMap
。将从每个输入字符串派生的
BigDecimal
映射到该字符串。键是
BigDecimal
对象(它们是),会按数学顺序自动排序。将调用
values
生成的集合馈送到新
列表的构造函数中,以获得结果

ListList=List.of(“200.1043725170”、“100.1043725171”、“100.1043725170”、“65535.4294967295”、“4294967295.65535”);
NavigableMapmap=
列表
.stream()
.收集(
汤姆(
(字符串s)->新的大十进制数,
Function.identity(),
(现有,替换)->现有,//在重复密钥冲突的情况下,第一个获胜。
树映射::新
)
);
Listresult=List.copyOf(map.values());
系统输出打印项次(结果);
看这个

[100.1043725170100.1043725171200.104372517065535.42949672954294967295.65535]


您可以将列表保留为按每个字符串元素生成的BigDecimal排序的字符串列表:

list.sort(Comparator.comparing(BigDecimal::new));
看这个

[100.1043725170100.1043725171200.104372517065535.42949672954294967295.65535]


作为字符串值进行比较。dList只是一个列表“list dList=new ArrayList();”--在返回时,我必须从这个APIs返回字符串列表什么是“double
BigDecimal
number”?为什么第一个和第三个都需要填充零,而不是最后一个?在我的输入中,最后一个元素没有尾随零。我不应该仅仅为了对输入值进行排序而对其进行操作。所以9位数字需要一个填充零,但5位数字不需要五个填充零?这毫无意义。你说,«但我也需要尾随零,因为我们在其他地方比较这些值。»@Andy同意了。正如我所说,您有两种选择:重新创建字符串,或者通过
映射管理字符串。我似乎没有领会你的意思?@Basil Bourque感谢您的编辑和有趣的替代解决方案您可以将新的BigDecimal简化为新的BigDecimal。值得注意的是,这种
toMap(…)
方法将消除重复项,这与接受答案的
list.sort(Comparator.comparing(BigDecimal::new))
不同。要保留重复项(或可能不同的字符串将解析为相同的值),必须使用
groupingBy
,以获取每个键的所有字符串列表,然后对
值()进行流式处理和
flatMap
list.sort(Comparator.comparing(BigDecimal::new));