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