java:一种有效的方法,它测试给定字符串中所有包含的数字都是按升序排列的

9rbhqvlz  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(182)

在java中,测试给定字符串中所有包含的数字都是升序的有效方法是什么?
示例字符串可能是

  1. String ascending = "Welc2ome T3o Co3mp67uter W99orld";
  2. String notAscending = "Welc8ome T3o Co3mp67uter W99orld";
xzlaal3s

xzlaal3s1#

避免使用 String.split 或者 Integer.parseInt 因为它没有效率。
如果应该支持国际数字和unicode字符,以下可能是一个解决方案。

  1. public static boolean isNumericValuesAscending(String s) {
  2. int max = -1;
  3. for (int i = 0; i< s.length(); i++) {
  4. char current = s.charAt(i);
  5. boolean isDigit = Character.isDigit(current);
  6. if (isDigit) {
  7. int currentNumericValue = Character.getNumericValue(current);
  8. if (max <= currentNumericValue) {
  9. max = currentNumericValue;
  10. } else {
  11. return false;
  12. }
  13. }
  14. }
  15. return true;
  16. }

如果if条件 max <= currentNumericValue 已更改为 max < currentNumericValue ,重复的数值,如 T3o Co3 以及 W99orld 不允许。

展开查看全部
gblwokeq

gblwokeq2#

它可以使用java streams+以更简洁的方式实现 AtomicInteger 要跟踪上一个数字:

  1. public static boolean ascendingDigits(String s) {
  2. AtomicInteger prev = new AtomicInteger('0');
  3. return s.chars()
  4. .mapToObj(c -> (char)c) // Stream of Character
  5. .filter(Character::isDigit) // filter digits including Unicode ranges
  6. .allMatch(c -> prev.getAndSet(c) <= c); // compare previous digit to current and update the previous one
  7. }

测试:

  1. String asc = "Welc2ome T3o Co3mp67uter W89orld\uFF10 \uFF15 \uFF17"; // using fullwidth digits
  2. System.out.println(asc);
  3. System.out.println(ascendingDigits(asc));
  4. String notAscending = "Welc8ome T3o Co3mp67uter W99orld";
  5. System.out.println(ascendingDigits(notAscending));

输出:

  1. Welc2ome T3o Co3mp67uter W89orld
  2. true
  3. false
展开查看全部

相关问题