You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:27:48