[英]Simple way to parse numbers as strings while sorting with Java streams?
我有一个对象列表,其中包含以字符串形式存储的值,但实际上是数字,我试图找到一种方法来将字符串解析为Java流中的整数以对其进行数字排序。 这是到目前为止我得到的。
List<SearchResultObject> returnedValues = doTheSearchMethod();
returnedValues = returnedValues
.stream()
.sorted(Comparator.comparing(SearchResultObject::getNumber))
.collect(Collectors.toList());
到目前为止,这种工作方式仍然存在,但问题在于,由于这些数字实际上是字符串,因此按字典顺序而不是数字对数字进行排序。 有没有办法将解析合并到流中? 所有数字均填充为相同大小。
3356001017053000000000000
3356001017002000000000000
3356001017004000000000000
3356001017026000000000000
5101004003020000000000000
4123000006002510000000000
4758000005010000000000000
使用comparingLong
然后解析很长的时间。 数字对于整数太大。
returnedValues.sort(Comparator.comparingLong(sro->Long.parseLong(sro.getNumber())));
对于仅排序,您不需要流,只需使用使用lambda表达式的自定义Comparator
器
Comparator<SearchResultObject> c = Comparator.comparingLong(s->Long.parseLong(s.getNumber()));
然后使用Collections.sort
方法
Collections.sort(returnedValues,c);
您不需要使用Streams API对列表进行排序,可以直接从List接口使用sort()
方法。 您只需要确保为sort()
方法提供适当的comparator
即可。
如前所述,您可以直接使用:
Comparator.comparing(SearchResultObject::getNumber)
比较器比较字符串。
但是,由于您需要通过比较整数/长整数来对列表进行排序,因此可以使用以下命令:
对于整数:
list.sort(Comparator.comparingInt(s ->Integer.parseInt(s.getNumber())));
长期:
list.sort(Comparator.comparingLong(s ->Long.parseLong(s.getNumber())));
您可以在下面的代码中检查输出:
Before sorting
SearchResultObject{number='100'}
SearchResultObject{number='2'}
SearchResultObject{number='10'}
After sorting
SearchResultObject{number='2'}
SearchResultObject{number='10'}
SearchResultObject{number='100'}
上面的输出基于SearchResultObject
包含number
作为字段的假设。
如果可以修改SearchResultObject
向其添加一个将String
转换为BigInteger
的方法,并在Comparator
使用它
public SearchResultObject {
...
public BigInteger getNumberAsBigInteger() {
return new BigInteger(this.number);
}
...
}
调用是
returnedValues.stream()
.sorted(
Comparator.comparing(
SearchResultObject::getNumberAsBigInteger
)
)
.collect(Collectors.toList());
如果您不能修改SearchResultObject
类,则必须对自定义Comparator
进行一些自定义,但是没有什么太复杂的了
returnedValues.stream()
.sorted(
Comparator.comparing(
sro -> new BigInteger(sro.getNumber())
)
)
.collect(toList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.