如何使用Java 8拼接列表中各单词的非重复字符?
Java 8提取列表单词非重复字符并拼接的实现思路
针对需求:给定单词列表,提取每个单词中仅出现一次的字符(保持原单词内的顺序),再将所有这些字符按单词顺序拼接成新字符串(示例输入[non, repeated, character],输出orpatdhte),以下是基于Java 8 Stream API的实现思路:
核心逻辑拆解
1. 单个单词的唯一字符提取
要从单个单词中筛选出仅出现一次的字符,需要两步:
- 统计字符频率:遍历单词的所有字符,统计每个字符的出现次数
- 按序过滤:再次遍历单词字符,保留那些出现次数恰好为1的字符,确保顺序与原单词一致
2. 批量处理与结果拼接
对列表中的所有单词执行上述操作,再将所有筛选出的字符合并拼接:
- 把单词列表转为Stream,用
flatMap将每个单词的字符流合并为一个全局字符流 - 最后将字符流拼接成最终字符串
代码实现
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class UniqueCharProcessor { public static void main(String[] args) { List<String> inputWords = Arrays.asList("non", "repeated", "character"); String output = processUniqueChars(inputWords); System.out.println(output); // 输出: orpatdhte } public static String processUniqueChars(List<String> words) { return words.stream() .flatMap(word -> { // 统计当前单词中每个字符的出现次数 Map<Character, Long> charFrequency = word.chars() .mapToObj(c -> (char) c) .collect(Collectors.groupingBy(c -> c, Collectors.counting())); // 过滤出仅出现一次的字符,保留原顺序 return word.chars() .mapToObj(c -> (char) c) .filter(charInWord -> charFrequency.get(charInWord) == 1); }) // 将字符拼接为字符串 .map(String::valueOf) .collect(Collectors.joining()); } }
代码说明
- 字符频率统计:通过
Collectors.groupingBy配合Collectors.counting()快速生成字符到出现次数的映射,这一步是线性时间复杂度 - 顺序过滤:再次遍历原单词的字符流,确保筛选出的字符顺序和原单词一致,避免打乱顺序
- 流合并:
flatMap将每个单词的字符流“扁平化”为一个连续的字符流,最后用Collectors.joining()完成拼接
可选优化
如果想减少一次字符遍历,也可以手动用HashMap统计频率,逻辑和上面一致,但可读性略有下降:
import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class UniqueCharProcessorOptimized { public static String processUniqueChars(List<String> words) { return words.stream() .flatMap(word -> { Map<Character, Integer> freqMap = new HashMap<>(); // 单次遍历统计频率 word.chars().mapToObj(c -> (char) c) .forEach(c -> freqMap.put(c, freqMap.getOrDefault(c, 0) + 1)); // 过滤唯一字符 return word.chars().mapToObj(c -> (char) c) .filter(c -> freqMap.get(c) == 1); }) .map(String::valueOf) .collect(Collectors.joining()); } }
内容的提问来源于stack exchange,提问作者jayendra bhatt
相关产品推荐
相关产品推荐

