我正在尝试确定字符串数组中的特定项目是否为整数。
我正在表单.split(" ")中使用中缀表达式String,然后尝试将结果数组拆分为两个数组;一个用于整数,一个用于运算符,同时丢弃括号和其他杂项。实现这一目标的最佳方法是什么?
.split(" ")
String
我以为我可能能够找到一种Integer.isInteger(String arg)方法或其他东西,但没有这样的运气。
Integer.isInteger(String arg)
最天真的方法是遍历字符串并确保所有元素都是给定基数的有效数字。这是尽可能高效的方法,因为您必须至少查看每个元素一次。我想我们可以根据基数对其进行微优化,但出于所有意图和目的,这与您期望的一样好。
public static boolean isInteger(String s) { return isInteger(s,10); } public static boolean isInteger(String s, int radix) { if(s.isEmpty()) return false; for(int i = 0; i < s.length(); i++) { if(i == 0 && s.charAt(i) == '-') { if(s.length() == 1) return false; else continue; } if(Character.digit(s.charAt(i),radix) < 0) return false; } return true; }
或者,您可以依靠 Java 库来实现这一点。它不是基于异常的,并且会捕获您能想到的几乎所有错误情况。它会贵一点(你必须创建一个 Scanner 对象,在一个非常紧密的循环中你不想这样做。但它通常不应该太贵,所以对于日常操作它应该是相当可靠的。
public static boolean isInteger(String s, int radix) { Scanner sc = new Scanner(s.trim()); if(!sc.hasNextInt(radix)) return false; // we know it starts with a valid int, now make sure // there's nothing left! sc.nextInt(radix); return !sc.hasNext(); }
如果最佳实践对您来说并不重要,或者您想吸引负责您的代码审查的人,请尝试以下大小:
public static boolean isInteger(String s) { try { Integer.parseInt(s); } catch(NumberFormatException e) { return false; } catch(NullPointerException e) { return false; } // only got here if we didn't return false return true; }