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