如何在Java Stream中访问字符串数组元素以实现哈希标签统计排序?
用Java Stream API统计并排序字符串中的哈希标签
你的代码存在几个关键问题,直接导致无法正确处理哈希标签:
String类没有自带的stream()方法,直接调用posts.stream()会编译报错,必须先将字符串拆分为单词集合再转为流。split("")是把单个字符串拆成字符数组,这不是你需要的单词拆分逻辑,应该用空格(支持多空格)拆分,比如split("\\s+")。- 过滤逻辑错误:
allMatch是判断流中所有元素都满足条件,但你要筛选的是单个单词以#开头,而非数组内所有字符都是#。
完整实现(统计次数并排序)
import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; public class HashtagStats { public static void main(String[] args) { String posts = "Example #java #streams string #java #lambda #streams etc."; // 统计哈希标签出现次数,按次数降序排序 Map<String, Long> hashtagCount = Arrays.stream(posts.split("\\s+")) // 筛选以#开头的单词 .filter(word -> word.startsWith("#")) // 移除开头的#,方便统计标签内容(可选,保留#则跳过此步) .map(hashtag -> hashtag.substring(1)) // 分组统计每个标签的出现次数 .collect(Collectors.groupingBy( tag -> tag, Collectors.counting() )) // 按出现次数降序排序,用LinkedHashMap保留顺序 .entrySet().stream() .sorted((e1, e2) -> Long.compare(e2.getValue(), e1.getValue())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> oldVal, java.util.LinkedHashMap::new )); // 输出结果 hashtagCount.forEach((tag, count) -> System.out.println("#" + tag + ": " + count)); } }
代码说明
Arrays.stream(posts.split("\\s+")):按任意数量的空格拆分字符串,得到单词流,避免多空格产生空字符串。.filter(word -> word.startsWith("#")):直接筛选出哈希标签,这是最直接的过滤逻辑。.map(hashtag -> hashtag.substring(1)):移除标签开头的#,如果需要保留#可以省略此步。- 分组统计后通过
sorted按次数降序排序,并用LinkedHashMap保存排序结果,保证输出顺序。
简化版(仅提取并排序标签)
如果不需要统计次数,只需要提取所有哈希标签并排序,代码可以简化:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class HashtagSort { public static void main(String[] args) { String posts = "Example #java #streams string #java #lambda #streams etc."; List<String> sortedHashtags = Arrays.stream(posts.split("\\s+")) .filter(word -> word.startsWith("#")) .sorted() .collect(Collectors.toList()); System.out.println(sortedHashtags); } }
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

