Java中查找字符串中最大数字的3种方法

通常,在处理多个编程场景时,会出现包含数字的字符串,并且可能需要找到这些值中最大的值。

1、字符串解析与比较
最简单的方法包括读取字符串并识别数字子字符串。我们可以通过比较前缀来检测最大的数字。让我们举个例子:

String inputString = "The numbers are 10, 20, and 5";
int expectedLargestNumber = 20;
@Test
void givenInputString_whenUsingBasicApproach_thenFindingLargestNumber() {
    String[] numbers = inputString.split(
"[^0-9]+");
    int largestNumber = Integer.MIN_VALUE;
    for (String number : numbers) {
        if (!number.isEmpty()) {
            int currentNumber = Integer.parseInt(number);
            if (currentNumber > largestNumber) {
                largestNumber = currentNumber;
            }
        }
    }
    assertEquals(expectedLargestNumber, largestNumber);
}

在这里:
  • 我们首先使用split()方法将名为inputString的输入字符串拆分为子字符串数组。这种除法是通过正则表达式 [^0-9]+ 进行的,该表达式仅截取字符串中的数字。
  • 随后,常规循环说明了字符串分割。该循环将数组限制为具有结果子字符串,并且故意不包含空字符串。每个非空子字符串的实现都包含使用Integer.parseInt()方法的显着转换。
  • 然后,将当前数值与迄今为止找到的最大数值进行比较,并在遇到更大的值时进行更新。最后,我们使用assertEquals()方法来确保largestNumber等于expectedLargestNumber。

2、使用正则表达式进行高效的数字提取
正则表达式使我们能够简洁有效地从字符串中提取数值。利用Pattern和Matcher类,我们使该过程更加简化。这是一个简单的例子:

@Test
void givenInputString_whenUsingRegularExpression_thenFindingLargestNumber() {
    Pattern pattern = Pattern.compile("\\d+");
    Matcher matcher = pattern.matcher(inputString);
    int largestNumber = Integer.MIN_VALUE;
    while (matcher.find()) {
        int currentNumber = Integer.parseInt(matcher.group());
        if (currentNumber > largestNumber) {
            largestNumber = currentNumber;
        }
    }
    assertEquals(expectedLargestNumber, largestNumber);
}

在这里,
  • 我们首先使用Pattern.compile()方法编译正则表达式 ( \d+ ) 。该表达式经过精心设计,专注于匹配输入字符串中的一个或多个数字。
  • 然后,我们通过将编译后的模式应用于inputString来初始化Matcher对象(表示为matcher )。

3、流和 Lambda 表达式
Java 8提出了Stream API和lambda表达式;因此,代码更加紧凑并且更易于阅读。

我们来看一个简单的实现:

@Test
void givenInputString_whenUsingStreamAndLambdaExpression_thenFindingLargestNumber() {
    int largestNumber = Arrays.stream(inputString.split("[^0-9]+"))
      .filter(s -> !s.isEmpty())
      .mapToInt(Integer::parseInt)
      .max()
      .orElse(Integer.MIN_VALUE);
    assertEquals(expectedLargestNumber, largestNumber);
}

在此测试方法中,我们首先过滤字符串以专门提取其数字部分,这是通过使用split()方法来实现的。此外,我们还采取措施来解决可能出现空流的问题,实现isEmpty()方法。

在初始过滤之后,我们利用mapToInt()方法系统地将每个非空子字符串转换为整数,这在Integer::parseInt引用的帮助下进行。随后,max()操作有效地识别处理流中存在的最大整数值。

我们使用orElse()方法来总结简化的方法,策略性地将默认值设置为Integer.MIN_VALUE。