使用Java流排序时将数字解析为字符串的简单方法吗?

时间:2019-07-12 20:59:55

标签: java sorting parsing java-8 java-stream

我有一个对象列表,这些对象包含作为字符串存储的值,但实际上是数字,我正在尝试找到一种方法来将字符串解析为Java流中的整数以对其进行数字排序。这就是我到目前为止所得到的。

List<SearchResultObject> returnedValues = doTheSearchMethod();
returnedValues = returnedValues
.stream()
.sorted(Comparator.comparing(SearchResultObject::getNumber))
.collect(Collectors.toList());

到目前为止,这种工作方式仍然有效,但问题在于,由于这些数字实际上是字符串,因此按字典顺序而不是数字对数字进行排序。有没有办法将解析合并到流中?所有数字都填充为相同大小。

3356001017053000000000000
3356001017002000000000000
3356001017004000000000000
3356001017026000000000000
5101004003020000000000000
4123000006002510000000000
4758000005010000000000000

4 个答案:

答案 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来对列表进行排序,因此可以使用以下内容:

  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作为字段的假设。

答案 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());