如何从顺序可变的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
相关产品推荐
相关产品推荐

