我有一个对象列表,这些对象包含作为字符串存储的值,但实际上是数字,我正在尝试找到一种方法来将字符串解析为Java流中的整数以对其进行数字排序。这就是我到目前为止所得到的。
List<SearchResultObject> returnedValues = doTheSearchMethod();
returnedValues = returnedValues
.stream()
.sorted(Comparator.comparing(SearchResultObject::getNumber))
.collect(Collectors.toList());
到目前为止,这种工作方式仍然有效,但问题在于,由于这些数字实际上是字符串,因此按字典顺序而不是数字对数字进行排序。有没有办法将解析合并到流中?所有数字都填充为相同大小。
3356001017053000000000000
3356001017002000000000000
3356001017004000000000000
3356001017026000000000000
5101004003020000000000000
4123000006002510000000000
4758000005010000000000000
答案 0 :(得分:0)
使用comparingLong
,然后长解析。数字对于整数太大。
returnedValues.sort(Comparator.comparingLong(sro->Long.parseLong(sro.getNumber())));
答案 1 :(得分:0)
仅需排序,就不需要流,只需使用自定义Comparator
和lambda表达式即可
Comparator<SearchResultObject> c = Comparator.comparingLong(s->Long.parseLong(s.getNumber()));
然后使用Collections.sort
方法
Collections.sort(returnedValues,c);
答案 2 :(得分:0)
您不需要使用Streams API来对列表进行排序,可以直接从List界面使用sort()
方法。您只需要确保为comparator
方法提供正确的sort()
。
如前所述,您可以直接使用:
Comparator.comparing(SearchResultObject::getNumber)
比较器比较字符串。
但是,由于您需要通过比较Integer / Long来对列表进行排序,因此可以使用以下内容:
对于整数:
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
作为字段的假设。
答案 3 :(得分:0)
如果您可以修改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());