[英]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.