如何使用 Java 中的流 api 将具有重复项的字符串列表转换为仅具有不同字符的字符串列表?

问题描述 投票:0回答:3

How to convert List = ["SSSttttrrrrriiiininnggg","vvvvvooootttteee","mmmmaaaaddddaaaammm"] to List =["String","eotv","dam"] 在java中使用流api?

我可以使用下面的代码消除字符串中的重复项,但我不确定如何处理字符串列表。顺序并不重要,而且在字母重复多次的情况下,输出中也不得出现重复项。

String string ="SSSttttrrriiiinnnnnggg";

string.chars()
.mapToObj(item -\> (char) item)
.collect(Collectors.toSet()).forEach(System.out::print);
java java-8 stream java-stream
3个回答
1
投票

您可以使用

IntStream#distinct
只获得不同的字符:

string
  .codePoints()//all code points (~chars)
  .distinct()//only distinct code points
  .collect(StringBuilder::new,
           StringBuilder::appendCodePoint, StringBuilder::append)//convert back to string
  .toString();

this answer以在代码点和字符串的

IntStream
s之间进行转换。

然后你可以用另一个包起来

Stream:

list
.stream()
.map(string->
  string
  .codePoints()
  .distinct()
  .collect(StringBuilder::new,
           StringBuilder::appendCodePoint, StringBuilder::append)
  .toString();
).toList()

0
投票

您可以使用

Stream#map
来转换
Stream
的每个元素。
.distinct
可用于删除重复项,只保留每个唯一字符的一个副本。

var res = strs.stream().map(s -> s.chars().distinct()
              .mapToObj(c -> String.valueOf((char) c))
              .collect(Collectors.joining())).toList();

0
投票

您可以使用

map()
类的
stream
方法压缩列表中的每个字符串,然后使用 collect() 方法将结果收集回列表中。

这里是你如何做到的:

List<String> list = Arrays.asList("SSSttttrrrriiiiinnnggg","vvvvvooootttteee","mmmmaaaaddddaaaammm");

List<String> compressedList = list.stream()
        .map(s -> {
            StringBuilder sb = new StringBuilder();
            char prev = 0;
            int count = 0;
            for (char c : s.toCharArray()) {
                if (c != prev) {
                    if (count > 0) {
                        sb.append(count);
                    }
                    prev = c;
                    count = 1;
                    sb.append(c);
                } else {
                    count++;
                }
            }
            sb.append(count);
            return sb.toString();
        })
        .map(s -> {
            StringBuilder sb = new StringBuilder();
            for (char c : s.toCharArray()) {
                if (Character.isLowerCase(c)) {
                    sb.append(c);
                }
            }
            return sb.toString();
        })
        .collect(Collectors.toList());

System.out.println(compressedList);

此代码首先使用

StringBuilder
压缩每个字符串以跟踪字符和计数,然后使用另一个
StringBuilder
删除所有非小写字符。最终结果被编成清单并打印出来。结果将是:

[String, eotv, dam]
© www.soinside.com 2019 - 2024. All rights reserved.