私は文字列の配列内の特定の項目が整数かどうかを判断しようとしています。
.split(" ")'ing
はString
形式の中置式で、結果の配列を2つの配列に分割しようとしています。 1つは整数用、1つは演算子用、もう1つは括弧の破棄、その他の雑多な項目です。これを達成するための最善の方法は何でしょうか。
私はInteger.isInteger(String arg)
メソッドか何かを見つけることができるかもしれないと思いました、しかしそのような運はありません。
最も単純な方法は、Stringを反復処理し、すべての要素が特定の基数に対して有効な数字であることを確認することです。各要素を少なくとも一度は見なければならないので、これは可能な限り効率的です。基数に基づいてそれをマイクロ最適化することができると思いますが、すべての意図と目的のためにこれはあなたが得ることが期待できるのと同じくらい良いです。
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;
}
正規表現を使うほうが良いです。
str.matches("-?\\d+");
-? --> negative sign, could have none or one
\\d+ --> one or more digits
代わりにif-statement
を使用できる場合は、ここでNumberFormatException
を使用するのはよくありません。
先頭にゼロを付けたくない場合は、次のように正規表現を使用します。
str.matches("-?(0|[1-9]\\d*)");
あるいは、Apache Commonsの親友からのちょっとした助けを借りることもできます。 StringUtils.isNumeric(String str)
あるいは単に
mystring.matches("\\d+")
intよりも大きい数に対してはtrueを返しますが
Integer.parseInt(String) メソッドを使用します。
try{
int num = Integer.parseInt(str);
// is an integer!
} catch (NumberFormatException e) {
// not an integer!
}
文字列を解析してNumberFormatException
をキャッチする代わりに、正規表現を使用することもできます。例えば.
if (Pattern.compile("-?[0-9]+").matches(str)) {
// its an integer
}
特に、正規表現をプリコンパイルして再利用する場合は、これが速くなる可能性があります。ただし、str
が有効なint
値の範囲外の数値を表している場合でも、Integer.parseInt(str)
は失敗します。
文字列が有効な整数ではない場合は、Integer.parseInt(str)
を使用してNumberFormatException
をキャッチできます。
static boolean isInt(String s)
{
try
{ int i = Integer.parseInt(s); return true; }
catch(NumberFormatException er)
{ return false; }
}
ただし、評価された整数がオーバーフローすると、同じ例外がスローされることに注意してください。あなたの目的は、それが有効な整数かどうかを調べることでした。そのため、妥当性をチェックするための独自の方法を作る方が安全です。
static boolean isInt(String s) // assuming integer is in decimal number system
{
for(int a=0;a<s.length();a++)
{
if(a==0 && s.charAt(a) == '-') continue;
if( !Character.isDigit(s.charAt(a)) ) return false;
}
return true;
}
文字列から整数を取得するためにInteger.parseInt()
またはInteger.valueOf()
を使用することができ、それが解析可能なintでない場合は例外をキャッチします。あなたはそれが投げることができるNumberFormatException
を必ずキャッチしたいです。
ValueOf()はプリミティブintではなくIntegerオブジェクトを返すことに注意してください。