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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:03:19