Java Token拆分问题:统计数打印位置错误求助
问题描述
给定一个匹配正则表达式[ A-Za-z !,?._'@]+的字符串s,需将其拆分为Token(定义为一个或多个连续英文字母),要求先打印Token总数,再逐行打印每个Token。
示例输入
He is a very very good boy, isn't he?
示例输出
10 He is a very very good boy isn t he
说明
字符串s中共有10个符合要求的Token,需按出现顺序打印。
我的实现代码
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */ Scanner scan = new Scanner(System.in); String s = scan.nextLine(); String[] tokens = s.split("[ !,?._'@]+"); int tokenCount = 0; for (String token : tokens) { if (!token.isEmpty()) { tokenCount++; System.out.println(token); } } System.out.println(tokenCount); } }
我的输出
He is a very very good boy isn t he 10
当前问题
Token总数被打印在最后一行,不符合“先打印总数”的需求。调整打印语句位置时,要么报错要么输出值错误,需要调整打印顺序的可行方案。
解决方案
问题核心是你当前的逻辑是先打印Token再输出总数,只需调整顺序即可,以下是两种可靠的修改方式:
方式一:先收集有效Token到列表
通过列表存储所有非空Token,先输出列表长度(即总数),再遍历打印每个Token:
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s = scan.nextLine(); String[] tokens = s.split("[ !,?._'@]+"); List<String> validTokens = new ArrayList<>(); // 先收集所有非空Token for (String token : tokens) { if (!token.isEmpty()) { validTokens.add(token); } } // 先打印总数 System.out.println(validTokens.size()); // 再逐行打印每个Token for (String token : validTokens) { System.out.println(token); } } }
方式二:先统计总数再打印Token
分两次遍历数组:第一次统计有效Token数量,第二次打印每个Token:
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String s = scan.nextLine(); String[] tokens = s.split("[ !,?._'@]+"); int tokenCount = 0; // 第一次遍历统计有效Token数量 for (String token : tokens) { if (!token.isEmpty()) { tokenCount++; } } // 先打印总数 System.out.println(tokenCount); // 第二次遍历打印每个有效Token for (String token : tokens) { if (!token.isEmpty()) { System.out.println(token); } } } }
两种方式都能满足需求:第一种只需遍历一次数组,通过列表存储数据;第二种需遍历两次数组,内存占用更低。根据场景选择即可。
内容的提问来源于stack exchange,提问作者user21489407
相关产品推荐
相关产品推荐

