簡體   English   中英

使用Java流排序時將數字解析為字符串的簡單方法嗎?

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

比較器比較字符串。

但是,由於您需要通過比較整數/長整數來對列表進行排序,因此可以使用以下命令:

  1. 對於整數:

    list.sort(Comparator.comparingInt(s ->Integer.parseInt(s.getNumber())));

  2. 長期:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM