文字列の配列内の特定の項目が整数であるかどうかを判断しようとしています。
私はフォーム.split(" ")
でインフィックス式を ' しString
、結果の配列を 2 つの配列に分割しようとしています。1 つは整数用、もう 1 つは演算子用で、括弧やその他のさまざまな項目は破棄します。これを実現する最善の方法は何でしょうか?
何か方法を見つけられるかもしれないと思ったのですInteger.isInteger(String arg)
が、残念ながら見つかりませんでした。
ベストアンサー1
最も単純な方法は、文字列を反復処理して、すべての要素が指定された基数に対して有効な数字であることを確認することです。各要素を少なくとも 1 回確認する必要があるため、これが可能な限りの効率です。基数に基づいてマイクロ最適化することはできると思いますが、実質的にはこれが期待できる最高の方法です。
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;
}