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

如何从顺序可变的ArrayList中获取mi和min前的数字?

解决ArrayList中提取mi/min前数字的问题

嘿,这个场景我太熟悉了!你遇到的indexOf("mi")返回-1的问题,本质是因为indexOf是精确匹配整个元素字符串,而你的列表元素应该是类似"15 mi"或者"30min"这种包含mi/min的组合,不是纯字符串"mi",所以肯定匹配不上。

针对顺序可变的ArrayList,最佳方案是遍历列表+正则匹配,既能灵活处理元素顺序,又能准确提取数字。下面给你两种实用的实现思路:

方案一:正则表达式(推荐,最灵活)

正则可以完美适配各种格式的元素(比如数字和mi/min之间有没有空格、数字是整数还是小数),代码示例:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExtractNumberDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("25 mi");
        list.add("10min");
        list.add("其他无关元素");
        list.add("7.5 mi"); // 支持小数

        // 匹配mi前的数字(整数/小数)
        Pattern miPattern = Pattern.compile("(\\d+(?:\\.\\d+)?)\\s*mi");
        // 匹配min前的数字(整数/小数)
        Pattern minPattern = Pattern.compile("(\\d+(?:\\.\\d+)?)\\s*min");

        for (String item : list) {
            // 处理mi的情况
            Matcher miMatcher = miPattern.matcher(item);
            if (miMatcher.find()) {
                String miNumStr = miMatcher.group(1);
                double miValue = Double.parseDouble(miNumStr); // 如果是整数可以用Integer
                System.out.println("提取到mi前的数字:" + miValue);
            }

            // 处理min的情况
            Matcher minMatcher = minPattern.matcher(item);
            if (minMatcher.find()) {
                String minNumStr = minMatcher.group(1);
                double minValue = Double.parseDouble(minNumStr);
                System.out.println("提取到min前的数字:" + minValue);
            }
        }
    }
}

正则说明:

  • (\\d+(?:\\.\\d+)?):匹配整数或小数,\\d+匹配整数部分,(?:\\.\\d+)?可选的小数部分(非捕获组,避免额外分组)
  • \\s*:匹配0个或多个空格,兼容"5mi"和"5 mi"两种格式
  • 分开写mi和min的正则,避免把"min"里的"mi"误匹配

方案二:字符串拆分(适合格式固定的场景)

如果你的元素格式非常规整(比如一定是数字+空格+mi/min或者数字+mi/min),可以用split方法简化:

for (String item : list) {
    // 先判断是min还是mi,避免混淆
    if (item.contains("min")) {
        String[] parts = item.split("min");
        if (parts.length > 0) {
            String numStr = parts[0].trim();
            // 验证是否为数字,防止格式错误
            if (numStr.matches("\\d+(?:\\.\\d+)?")) {
                double minValue = Double.parseDouble(numStr);
                // 你的业务逻辑
            }
        }
    } else if (item.contains("mi")) {
        String[] parts = item.split("mi");
        if (parts.length > 0) {
            String numStr = parts[0].trim();
            if (numStr.matches("\\d+(?:\\.\\d+)?")) {
                double miValue = Double.parseDouble(numStr);
                // 你的业务逻辑
            }
        }
    }
}

额外注意点

  • 一定要先判断min再判断mi,不然"min"会被当成"mi"处理,导致错误
  • 提取数字后最好做格式验证,避免非数字内容抛出NumberFormatException
  • 如果你的列表元素不是字符串类型,需要先转成字符串再处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:38:58