2017-09-23 22 views
0

基本的に、数字が文字列に何回現れているかをチェックし、それを印刷するプログラムを書くように求められました。これは私が持っているものです文字列内の任意の数字の文字列をチェックする良い方法はありますか?

BufferedReader input = new BufferedReader (new InputStreamReader (System.in)); 
    System.out.println("Please enter your string"); 
    String s = input.readLine(); 
    /*System.out.println("Please enter the chracter you are looking for"); 
    char c = (char)input.read();*/ 
    char one = '1'; 
    char two = '2'; 
    char three = '3'; 
    char four = '4'; 
    char five = '5'; 
    char six = '6'; 
    char seven = '7'; 
    char eight = '8'; 
    char nine = '9'; 
    char zero= '0'; 
int counter = 0; 
for(int i=0; i<s.length(); i++) { 
    if(s.charAt(i) == one || s.charAt(i) == two || s.charAt(i) == three || s.charAt(i) == four || 
s.charAt(i) == five || s.charAt(i) == six || s.charAt(i) == seven 
|| s.charAt(i) == eight || s.charAt(i) == nine || s.charAt(i) == zero) { 
     counter++; 


    } 


} 

これを行うには、より速く、より良い方法はありますか?私は別の方法を試してみましたが、このエラーの代わりにコードに自分で数字を宣言する

Error: The operator || is undefined for the argument type(s) boolean, char 
+1

プログラミング言語用のタグを追加してください。 – miroxlav

答えて

0

のために、あなたはJavaでCharacter.isDigit()方法を見てみることができます。これはコードをもっときれいにするでしょう。これを行うもっと速い方法は他にありません。

各桁の出現を数えたい場合は、Javaマップを使用するのが簡単です。 hereからマップに関する基本的なチュートリアルを読むことができます。

0

これはC#の

foreach (char c in str) 
    { 
     if (c >= '0' && c <= '9') 
      counter++; 
    } 
+0

OPのJava用ソリューションを探しています。 – soorapadman

0

にあなたは、文字の10進値を使用することができます動作します(ASCII tableで定義されている)

String s = "abc123def456"; 
int cpt = 0; 
for (int i = 0; i < s.length(); i++) { 
    if (s.charAt(i) >= '0' && s.charAt(i) <= '9') { 
     cpt++; 
    } 
} 
System.out.println(cpt); // 6 

またCharacter::isDigit方法

if (Character.isDigit(s.charAt(i))) { 
    cpt++; 
} 
を使用することができます

EDIT:

Java 8以上を使用している場合は、文字列内で文字列を有効にし、数字を保持するフィルタを適用して、その中の要素の数を数えます。

long nbDigits = s.chars() 
    .filter(Character::isDigit) // If the character is a digit (= the isDigit() method returns true) it's kept in the stream 
    .count(); 
System.out.println(nbDigits); // 6 
0

この

あなたのアプローチを行うにはより速く、より良い方法があるが、ほとんど最大急速絶対正しいとです!あなたはそれを読むことができます。

は、私は一般的なアルゴリズムはO(n)で、すべての言語で同じであることを考える:

  1. ループ配列およびインクリメントカウンタたときに数文字を見つけます。

あなたのアプローチは絶対正確でほぼ最大です!注:私は2つの比較と9の間の速度が非常に小さいと考え、それに気を付けるべきではありません)できるだけ少ないコード行で書くだけです。あなたは修正次の操作を行うことができます。0-90x30-0x39であるためにあなたが==からch >= '0' && ch <= '9'に移動することができるように

  1. charは、JVMの整数とASCIIコードです。
  2. 文字クラスには、それを確認する特別な方法が含まれています:Character.isDigit(ch)
  3. javaの場合、の代わりにStreamsを使用できます。

私はこのアプローチは最高速度を提供し、澱メモリが(javaの8から)ストリームを使用して

public int countDigits(String str) { 
    int count = 0; 

    for(int i = 0; i < str.length(); i++) 
     if(Character.isDigit(str.charAt(i))) 
      count++; 

    return count; 
} 

オブジェクトだと思うストリーム(昔ながらのjava)を使用していません。上手く見え、前の例より少し遅く動作し、メモリにいくつかの追加オブジェクトを作成します。

public int countDigits(String str) { 
    // could be a little bit slower, because additional objects are created inside 
    return (int)str.chars().filter(Character::isDigit).count(); 
} 

P.S.あなたのスキルを表示したい場合は、普通の古いJavaの亜種がより望ましいです。作業コードでは、両方の変種が等しい。

P.P.S.実際にはString.toCharArray()またはstr.chars()は、str.charAr(int)がメモリ内に追加のオブジェクトを作成するため、より洗練された外観であり、少しでも少なくなりますが、str.charAr(int)は内部配列で直接動作します。しかし、私は実際のアプリケーションでどんなアプローチでも問題に直面しませんでした。

+2

あなたの最初の主張は間違っています。 OPsコードは、iごとにcharAt(i)を10回呼び出します。あなたが「最大の速さ」であると考えるなら、あなたと私は、これら2つの言葉が意味するものとは非常に異なる数しかありません。 – GhostCat

+0

@GhostCat +1。あなたに同意。これは絶対正確ではありません。私はメモを変更しました。 –

関連する問題