在java中,测试给定字符串中所有包含的数字都是升序的有效方法是什么?示例字符串可能是
String ascending = "Welc2ome T3o Co3mp67uter W99orld";String notAscending = "Welc8ome T3o Co3mp67uter W99orld";
String ascending = "Welc2ome T3o Co3mp67uter W99orld";
String notAscending = "Welc8ome T3o Co3mp67uter W99orld";
xzlaal3s1#
避免使用 String.split 或者 Integer.parseInt 因为它没有效率。如果应该支持国际数字和unicode字符,以下可能是一个解决方案。
String.split
Integer.parseInt
public static boolean isNumericValuesAscending(String s) { int max = -1; for (int i = 0; i< s.length(); i++) { char current = s.charAt(i); boolean isDigit = Character.isDigit(current); if (isDigit) { int currentNumericValue = Character.getNumericValue(current); if (max <= currentNumericValue) { max = currentNumericValue; } else { return false; } } } return true;}
public static boolean isNumericValuesAscending(String s) {
int max = -1;
for (int i = 0; i< s.length(); i++) {
char current = s.charAt(i);
boolean isDigit = Character.isDigit(current);
if (isDigit) {
int currentNumericValue = Character.getNumericValue(current);
if (max <= currentNumericValue) {
max = currentNumericValue;
} else {
return false;
}
return true;
如果if条件 max <= currentNumericValue 已更改为 max < currentNumericValue ,重复的数值,如 T3o Co3 以及 W99orld 不允许。
max <= currentNumericValue
max < currentNumericValue
T3o Co3
W99orld
gblwokeq2#
它可以使用java streams+以更简洁的方式实现 AtomicInteger 要跟踪上一个数字:
AtomicInteger
public static boolean ascendingDigits(String s) { AtomicInteger prev = new AtomicInteger('0'); return s.chars() .mapToObj(c -> (char)c) // Stream of Character .filter(Character::isDigit) // filter digits including Unicode ranges .allMatch(c -> prev.getAndSet(c) <= c); // compare previous digit to current and update the previous one}
public static boolean ascendingDigits(String s) {
AtomicInteger prev = new AtomicInteger('0');
return s.chars()
.mapToObj(c -> (char)c) // Stream of Character
.filter(Character::isDigit) // filter digits including Unicode ranges
.allMatch(c -> prev.getAndSet(c) <= c); // compare previous digit to current and update the previous one
测试:
String asc = "Welc2ome T3o Co3mp67uter W89orld\uFF10 \uFF15 \uFF17"; // using fullwidth digitsSystem.out.println(asc);System.out.println(ascendingDigits(asc));String notAscending = "Welc8ome T3o Co3mp67uter W99orld";System.out.println(ascendingDigits(notAscending));
String asc = "Welc2ome T3o Co3mp67uter W89orld\uFF10 \uFF15 \uFF17"; // using fullwidth digits
System.out.println(asc);
System.out.println(ascendingDigits(asc));
System.out.println(ascendingDigits(notAscending));
输出:
Welc2ome T3o Co3mp67uter W89orld0 5 7truefalse
Welc2ome T3o Co3mp67uter W89orld0 5 7
true
false
2条答案
按热度按时间xzlaal3s1#
避免使用
String.split
或者Integer.parseInt
因为它没有效率。如果应该支持国际数字和unicode字符,以下可能是一个解决方案。
如果if条件
max <= currentNumericValue
已更改为max < currentNumericValue
,重复的数值,如T3o Co3
以及W99orld
不允许。gblwokeq2#
它可以使用java streams+以更简洁的方式实现
AtomicInteger
要跟踪上一个数字:测试:
输出: