【问题标题】:unwanted behaviour in StringTokenizerStringTokenizer 中不需要的行为
【发布时间】:2021-03-16 07:11:29
【问题描述】:

我有一个字符串Result = "FFF-556-GHH-788;DDR4TG441"。我使用 StringTokenizer 分割分隔符';'上的字符串。但是我得到的两个子字符串是1->"FFF-556-GHH-788"2->"DDR4TG441DDR4TG441DDR4TG441"。为什么 String 2 重复了 3 次?

代码: 主要:

datum = parseResult(Result);

有趣:

public QRResultData parseResult(String Result)
    {
        QRResultData data = new QRResultData();
        StringTokenizer multiTokenizer = new StringTokenizer(Result, ";");

        if(multiTokenizer.hasMoreTokens())
        {
            data.busNumber = multiTokenizer.nextToken();
        }

        if(multiTokenizer.hasMoreTokens())
        {
            data.seatNumber = multiTokenizer.nextToken();
        }
        return data;
    }

【问题讨论】:

  • StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法
  • 检查您在结果字符串中传递的确切内容。
  • 我无法复制它。 StringTokenizer multiTokenizer = new StringTokenizer("FFF-556-GHH-788;DDR4TG441", ";"); Log.i(TAG, multiTokenizer.nextToken()); Log.i(TAG, multiTokenizer.nextToken()); 记录“FFF-556-GHH-788”和“DDR4TG441”

标签: java android tokenize


【解决方案1】:

奇怪,当我运行你的代码时,它可以工作。您能否验证您问题中的代码与生产中的代码是否匹配?

import java.util.StringTokenizer;

public class So66650493 {

    public static void main(String[] args) {
        String Result = "FFF-556-GHH-788;DDR4TG441";
        final QRResultData datum = new So66650493().parseResult(Result);
        System.out.println("datum = " + datum);
        // datum = QRResultData{busNumber='FFF-556-GHH-788', seatNumber='DDR4TG441'}
        if ("FFF-556-GHH-788".equals(datum.busNumber)
                && "DDR4TG441".equals(datum.seatNumber)) {
            System.out.println("SUCCESS parsed correctly");
        } else {
            System.out.println("FAIL");
        }
    }

    public QRResultData parseResult(String Result) {
        QRResultData data = new QRResultData();
        StringTokenizer multiTokenizer = new StringTokenizer(Result, ";");
        if (multiTokenizer.hasMoreTokens()) {
            data.busNumber = multiTokenizer.nextToken();
        }
        if (multiTokenizer.hasMoreTokens()) {
            data.seatNumber = multiTokenizer.nextToken();
        }
        return data;
    }

    private static class QRResultData {
        String busNumber;
        String seatNumber;

        @Override
        public String toString() {
            return "QRResultData{" +
                    "busNumber='" + busNumber + '\'' +
                    ", seatNumber='" + seatNumber + '\'' +
                    '}';
        }
    }

}

我之前用 String.split 替换 StringTokenizer 的建议对你没有多大帮助。但这会使您的代码更易读。

public QRResultData parseResult(String Result) {
    QRResultData data = new QRResultData();
    String[] split = Result.split(";");
    data.busNumber = split[0];
    if (split.length > 1) {
        data.seatNumber = split[1];
    }
    return data;
}

【讨论】:

  • 不是真正的答案。
  • 抱歉,我的简短回答并没有冒犯任何人的意思。我试图改进它。
  • 好的,我正在从二维码获取字符串结果;看起来像二维码编码器中的一些问题
  • 你能说出真正的输入是什么吗?以及真正的预期输出?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多