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

Java中按字符串奇偶长度拆分ArrayList元素的实现问题

问题:按字符串长度奇偶性拆分Reader类中的字符串列表

我有Reader和Tokenizer两个Java类,需要在Tokenizer类中对Reader类的Wlist ArrayList中的字符串进行拆分,拆分规则如下:

  • 长度为奇数的字符串:前若干组为2个字符,最后一组为3个字符(示例:"teacher"拆分为"te"、"ac"、"her")
  • 长度为偶数的字符串:所有组均为2个字符(示例:"cattle"拆分为"ca"、"tt"、"le")

现有代码

Reader类

import java.util.ArrayList;

public class Reader {

    String[] wordList = {"Printer", "Airport", "Painter", "Letter",
                         "vehicle", "Teacher"};

    String[] SentenceList = {"Device made to waste ink and paper","Platform for Commercial air transport",
                             "Someone who uses colors and brushes","a written type of communication sent by mail",
                             "Thing used to travel via land","A person who teaches"};

    ArrayList<String> Wlist = new ArrayList<>(6);
    public ArrayList<String> wordCheck(){

        for(int i=0;i<6;i++){
            if((wordList[i] != null) && (!wordList[i].equals("")) && (wordList[i].matches("^[a-zA-Z]*$"))
                    && (wordList[i].length()>4)) {
                Wlist.add(wordList[i].toUpperCase());
            }
            else
            {
                System.out.println("Array does NOT satisfy the required criteria");
                break;
            }
        }
        return Wlist;
    }

    public ArrayList<String> getWord(){
        return wordCheck();
    }
    public ArrayList<String> Sentence(){
        ArrayList<String> Slist = new ArrayList<>(6);
        for(int i=0;i<6;i++){
            Slist.add(SentenceList[i]);
        }
        return Slist;
    }

}

现有Tokenizer类(逻辑不符合需求)

import java.util.ArrayList;
import java.util.List;

public class Tokenizer {
    Reader rd = new Reader();
    ArrayList<String> SplList = new ArrayList<>();
    public ArrayList<String> splitString() {
        ArrayList<String> Wlist = rd.getWord();
        for(int i=0;i<Wlist.size();i++){
                SplList.add(Arrays.toString(Wlist.get(i).split("(?<=\\\\G..)(?=..)")));
        }
        System.out.println(SplList);
        return SplList;
    }
}

问题分析

现有Tokenizer使用的正则拆分逻辑split("(?<=\\G..)(?=..)")只能将字符串按每2个字符拆分,无法处理奇数长度字符串的最后一组3字符需求,同时代码还缺少java.util.Arrays的导入,会引发编译错误。

正确实现方案

以下是修正后的Tokenizer类,通过循环处理每个字符串,严格遵循奇偶长度的拆分规则:

import java.util.ArrayList;
import java.util.Arrays;

public class Tokenizer {
    Reader rd = new Reader();
    ArrayList<String> SplList = new ArrayList<>();

    public ArrayList<String> splitString() {
        ArrayList<String> Wlist = rd.getWord();

        for (String word : Wlist) {
            int len = word.length();
            ArrayList<String> parts = new ArrayList<>();
            int index = 0;

            if (len % 2 == 1) {
                // 奇数长度:前(len-3)个字符按2个一组拆分
                while (index < len - 3) {
                    parts.add(word.substring(index, index + 2));
                    index += 2;
                }
                // 添加最后3个字符
                parts.add(word.substring(index));
            } else {
                // 偶数长度:全部按2个一组拆分
                while (index < len) {
                    parts.add(word.substring(index, index + 2));
                    index += 2;
                }
            }
            // 将拆分后的数组转为字符串存入SplList,保持原有输出格式
            SplList.add(Arrays.toString(parts.toArray(new String[0])));
        }

        System.out.println(SplList);
        return SplList;
    }
}

关键逻辑说明

  1. 奇偶判断:通过len % 2 == 1判断字符串长度是否为奇数
  2. 奇数长度处理:先循环拆分前len-3个字符为2字符组,最后添加剩余的3个字符
  3. 偶数长度处理:直接循环拆分所有字符为2字符组
  4. 格式保持:使用Arrays.toString()将拆分后的列表转为字符串,和原有代码的输出格式一致

内容的提问来源于stack exchange,提问作者coder107

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:55:35