【问题标题】:How do I sort each string within a stream of strings?如何对字符串流中的每个字符串进行排序?
【发布时间】:2022-01-13 23:34:58
【问题描述】:

我现在正在尝试将 map() 函数应用于字符串流,以便新流包含每个字符串的排序版本。也就是说,它不是“cat”,而是“act”。我正在尝试这样运行该方法:

Stream<String> sortedStream = validWordStream.map(s -> Arrays.sort(s.toString().toCharArray()));

但是,它抱怨返回的流是对象流,而不是字符串:

问题

我必须对 map() 函数进行哪些直观的更改才能获得排序字符串流?

【问题讨论】:

  • 您需要将已排序的字符数组转换回字符串。
  • Arrays.sort 方法不返回任何内容,它不是函数,它对数组进行就地排序。你不能像这样对流使用它。你可以做类似s -&gt; { char[] array = s.toCharArray(); Arrays.sort(array); return new String(array); }
  • 顺便说一下,char 类型自 Java 2 以来一直是遗留的。作为 16 位值,它在物理上无法表示大多数字符。学习使用代码点整数而不是处理单个字符。
  • @BasilBourque 处理String 在代码点方面的API 已在Java 5 中引入。但是以这种方式对字符串的字符进行排序的想法无论如何仅适用于ASCII 字母。否则,您必须考虑字素簇,并讨论操作在更改位置时是否应在σς 之间转换等。

标签: java string java-stream


【解决方案1】:

由于Array.sort 的返回类型是void,所以不能将其值用作map 结果。 此外,如果存在代理对,您将不会得到正确的结果。

所以:

Stream<String> validWord = foo();
Stream<String> validSortedWord = validWord
    .map(s -> s.codePoints().sorted().toArray())
    .map(sortedCodepoints -> new String(sortedCodePoints, 0, sortedCodePoints.length))

(编辑:更改了 String 构造函数的第三个参数,请参阅 Sree Kumar 的评论)

【讨论】:

  • 不错的答案。有一个缺陷,猜你没有测试你的代码。将sortedCodePoints.length - 1 更改为sortedCodePoints.length。另外,传递的参数名称sortedCodepoints和引用的参数名称之间存在大小写差异。
【解决方案2】:

对每个char数组进行排序,然后生成一个新的String:

Stream<String> sortedStream = validWordStream
      .map(s -> { char[] c = s.toCharArray(); 
                  Arrays.sort(c);
                  return new String(c);});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2016-05-25
    • 2015-04-15
    • 2022-01-25
    • 2011-01-23
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多