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);
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()
您可以使用
Stream#map
来转换Stream
的每个元素。 .distinct
可用于删除重复项,只保留每个唯一字符的一个副本。
var res = strs.stream().map(s -> s.chars().distinct()
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining())).toList();
您可以使用
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]