使用lambda表达式反转字符串中的单词

时间:2015-12-09 01:07:56

标签: java string lambda java-8 java-stream

所以我正在做一些标准的编程面试问题,并遇到了这个问题:

  

字符串中的反向字(单词由一个或多个空格分隔)

我认为使用lambda表达式来做它会很有趣,但我发现很难做到正确而且我的解决方案感觉有点笨拙和hacky。所以现在我的问题是:是否存在比我更惯用的解决方案?

public static String reverseWordsInString(String str)
{
    StringBuilder sb = new StringBuilder();

    Stream.of(str.split(" ")).forEach(
        word -> sb.append(reverseWord(word, !str.endsWith(word)))
    );
    return sb.toString();
}
public static String reverseWord(String str, boolean trailingSpace)
{
    StringBuilder sb = new StringBuilder();

    for(int i = str.length() - 1; i >= 0; i--)
    {
        sb.append(str.charAt(i));
    }
    sb.append(trailingSpace ? " " : "");
    return sb.toString();
}

4 个答案:

答案 0 :(得分:3)

您的任务描述有点含糊不清。我无法识别你是否必须反转单词反转单词的字符。但这里有两种解决方案:

public static String reverseWordsInString(String str) {
    return String.join(" ", Pattern.compile(" +").splitAsStream(str)
        .collect(LinkedList::new, LinkedList::addFirst, (a,b)->a.addAll(0, b)));
}

public static String reverseWordCharacters(String str) {
    return Pattern.compile(" +").splitAsStream(str)
        .map(word->new StringBuilder(word).reverse())
        .collect(Collectors.joining(" "));
}

第一个将反转字符串的单词,因此reverseWordsInString("this is an example")将返回example an is this,第二个将反转每个单词的字符,因此reverseWordCharacters("this is an example")会产生siht si na elpmaxe }。

答案 1 :(得分:2)

关注pvg评论Java 8 stream reverse order回答这个问题,但很难从问题本身中找出它,因为它引用了整数。
所以根据Venkata Raju在上面回答:

Arrays.stream(sentance.split("\\s+"))
         .collect(Collectors.toCollection(LinkedList::new))
         .descendingIterator().forEachRemaining(System.out::println);

将结果拆分并收集到中间链表并按相反顺序迭代

答案 2 :(得分:0)

以下内容应在python中起作用,其中message是消息

def reverse_words(message):
    return ' '.join([x[::-1] for x in message[::-1].split(' ')])

答案 3 :(得分:0)

另一种没有模式或正则表达式的解决方案。这是把句子中的单词倒过来,而不是单词中的字符。

public static String reverseWordsInString(String str) {
  return String.join(" ", Stream.of(str.split(" "))
                .collect(LinkedList::new, LinkedList::addFirst, (a,b)->a.addAll(0, b)));
}