基于java流的字母大小写排列

ibrsph3r  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(456)

如何使用java流根据给定的字符串输入查找字母大小写的所有差异?
巩固我对java流的理解。我正在用java流解决leetcode的简单问题。我对如何使用流解决回溯问题感到困惑。我特别搞不懂如何两次Map一个字符(小写和大写)。

Input: S = "a1b2"
Output: ["a1b2","a1B2","A1b2","A1B2"]

Stream.of(S.split(""))
      .map(str -> str.toUpperCase()) // this will upper case only
      .map(str -> str.toLowerCase()) // this will lower case only. how to use both?
      .collect(Collectors.toList()); //how do i concatenate strings before adding into list

为糟糕的英语提前道歉

b5lpy0ml

b5lpy0ml1#

你可以用flatmap来实现,但是你的输出是 ["a", "A", "1", "b", "B", "2"] 这和你想要的完全不同。请注意,您的输出会很快变大;对于输入中的每个字母,输出的#将加倍。这与streams所做的并不匹配。
一般来说,你想在这里做什么是不可能的,或者需要弯曲工具,就像用锤子在三明治上涂黄油一样。你也许可以,但你为什么要这么做?这不会提高你使用锤子的技能。

fcwjkofz

fcwjkofz2#

正如rzwitserloot所说,这类问题通常不会使用流攻击,但是我将尝试解决您在问题中的疑问:
对于包含字母大小写版本的流,您可以使用以下内容:

Stream.of(input.split(""))
    .filter(c -> Character.isLetter(c.charAt(0))) // Filter only letters
    .flatMap(str -> Stream.of(str, str.toUpperCase())) // Flatten the stream with both letters
    .collect(Collectors.toList())

如果要在Map流中的值之后连接列表中的字符串,而不是使用 Collectors.toList() 你可以用 Collectors.joining() 这样地:

Stream.of(input.split(""))
    .filter(c -> Character.isLetter(c.charAt(0))) // Filter only letters
    .flatMap(str -> Stream.of(str, str.toUpperCase()))
    .collect(Collectors.joining()) // this collector can receive a delimiter if you want to join them separated by comman for example.

现在对于所讨论的问题,您不需要字母的大小写版本,只需从输入单词中筛选字母,并开始用大写版本的1替换单词中的字母,这可能是一个可行的解决方案:

public static void main(String[] args) {
        String input = "a1b2";
        // Output: ["a1b2","a1B2","A1b2","A1B2"];

        Set<String> result = new HashSet<>();
        result.add(input);
        Stream.of(input.split(""))
                .filter(c -> Character.isLetter(c.charAt(0)))
                .forEach(c -> result.addAll(
                        result.stream().map(str -> {
                            if (!str.equals(input.toUpperCase())) {
                                return str.replaceFirst(c, c.toUpperCase());
                            }
                            return str;
                        }).collect(Collectors.toSet()))
                );
        System.out.println(result);
    }

相关问题