2025-04-21
JAVA
0

目录

Java字符串处理实战:单词排序与频率统计
问题描述
解决方案
核心实现代码
代码解析
关键知识点
示例分析
性能优化建议
实际应用场景
总结

Java字符串处理实战:单词排序与频率统计

在日常开发中,字符串处理是最常见的任务之一。今天,我将分享一个实用的Java字符串处理案例:如何对句子中的单词进行内部排序,并按照特定规则重新组织整个句子。

问题描述

我们需要实现一个Java程序,能够:

  1. 接收用户输入的英文句子
  2. 对每个单词中的字母进行排序(升序)
  3. 统计处理后单词的出现频率
  4. 按照频率(降序)、长度(升序)、字典序(升序)的优先级重新组织句子
  5. 输出最终结果

解决方案

核心实现代码

java
import java.util.*; import java.util.stream.Collectors; public class StringProcessor { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); String result = processString(input); System.out.println(result); } public static String processString(String input) { String[] words = input.split(" "); List<String> sortedWords = Arrays.stream(words) .map(word -> { char[] chars = word.toCharArray(); Arrays.sort(chars); return new String(chars); }) .collect(Collectors.toList()); Map<String, Integer> frequencyMap = new HashMap<>(); sortedWords.forEach(word -> frequencyMap.put(word, frequencyMap.getOrDefault(word, 0) + 1)); List<String> uniqueWords = new ArrayList<>(frequencyMap.keySet()); uniqueWords.sort((w1, w2) -> { int freqCompare = frequencyMap.get(w2).compareTo(frequencyMap.get(w1)); if (freqCompare != 0) return freqCompare; int lengthCompare = Integer.compare(w1.length(), w2.length()); if (lengthCompare != 0) return lengthCompare; return w1.compareTo(w2); }); StringBuilder result = new StringBuilder(); for (String word : uniqueWords) { int count = frequencyMap.get(word); result.append((word + " ").repeat(count)); } return result.toString().trim(); } }

代码解析

  1. 输入处理

    • 使用Scanner类读取用户输入的一行字符串
  2. 单词内部排序

    • 将输入字符串按空格分割成单词数组
    • 使用Stream API对每个单词的字符进行排序
    • Arrays.sort(chars)实现字符数组的升序排列
  3. 频率统计

    • 使用HashMap统计每个排序后单词的出现次数
    • getOrDefault方法简化计数逻辑
  4. 多条件排序

    • 自定义比较器实现三级排序:
      1. 频率降序(高频在前)
      2. 长度升序(短词在前)
      3. 字典序升序(字母序在前)
  5. 结果构建

    • 使用StringBuilder高效拼接字符串
    • repeat方法根据频率重复单词
    • trim去除末尾多余空格

关键知识点

  1. Java Stream API

    • 使用Arrays.stream()map操作简化集合处理
    • collect(Collectors.toList())将流转换为列表
  2. Lambda表达式

    • 简化比较器的实现
    • 使代码更加简洁易读
  3. 字符串处理技巧

    • toCharArray()new String(chars)实现字符串与字符数组的转换
    • String.join()StringBuilder的合理选择
  4. 集合框架

    • HashMap的高效统计
    • ArrayList的排序操作

示例分析

输入

hello world hello java code code

处理过程

  1. 单词内部排序后:

    • "hello" → "ehllo"
    • "world" → "dlorw"
    • "hello" → "ehllo"
    • "java" → "aajv"
    • "code" → "cdeo"
    • "code" → "cdeo"
  2. 频率统计:

    • "ehllo": 2
    • "dlorw": 1
    • "aajv": 1
    • "cdeo": 2
  3. 排序优先级:

    • 先按频率(2在前):"cdeo", "ehllo", "aajv", "dlorw"
    • 同频率按长度:"cdeo"和"ehllo"长度相同
    • 最后按字典序:"cdeo"在"ehllo"前
  4. 最终输出:

cdeo cdeo ehllo ehllo aajv dlorw

性能优化建议

  1. 大数据量处理

    • 对于超长字符串,考虑使用并行流:Arrays.stream(words).parallel()
  2. 内存优化

    • 如果处理超大文本,可以采用分批处理策略
  3. 扩展性考虑

    • 将排序规则抽象为策略模式,便于扩展新的排序规则

实际应用场景

这种字符串处理技术在以下场景中非常有用:

  1. 文本分析:统计词频并规范化处理
  2. 数据清洗:统一不同格式的单词表示
  3. 密码学:基本的字母重排操作
  4. 自然语言处理:文本预处理阶段

总结

通过这个案例,我们学习了:

  1. Java字符串处理的基本操作
  2. Stream API的实用技巧
  3. 多条件排序的实现方法
  4. 频率统计的高效方式

这种综合运用Java集合框架和流式API的解决方案,不仅代码简洁,而且性能高效,是日常开发中值得掌握的模式。

你对这样的字符串处理有什么想法或问题?欢迎在评论区留言讨论!