2016-09-11 8 views
0

1つのJavaプログラムを作成しようとしています。このプログラムは、ユーザからの文字列を入力として受け取り、その中の特殊文字を取り除いて出力を表示します。そして、新しい行の各文字列を表示Java MatcherとPattern APIを使用せずに特殊文字を削除する

のは、私のプログラムは、XYZ Abcの

よう
恐ろしい
を特殊文字を削除することで出力を表示する必要があり、この文字列を読んだ後、私は、この文字列[email protected],2016!horrible_just?kiddingを持っているとしましょう

は、今私が知っているだけ
冗談はすでに利用可能なAPIのようなのMatcherがあるパターンこれを行うにはjavaのAPI。しかし、私はJavaの初心者ですので、APIを使用したくないので、コードを少しずつ解読しようとしています。

これはこれまで私が試したことです。私がここで行ったことは、ユーザーから文字列を取り出し、特殊文字を配列に格納し、特殊文字を取得するまで比較を行うことです。また、新しい文字をStringBuilderクラスに格納します。

は、ここで私は新しい行にそれぞれの文字列を取得していない午前、

import java.util.*; 
class StringTokens{ 
    public void display(String string){ 
     StringBuilder stringToken = new StringBuilder(); 
     stringToken.setLength(0); 
     char[] str = {' ','!',',','?','.','_','@'}; 
     for(int i=0;i<string.length();i++){ 
      for(int j =0;j<str.length;j++){ 
       if((int)string.charAt(i)!=(int)str[j]){ 
        stringToken.append(str[j]); 
       } 
       else { 
        System.out.println(stringToken.toString()); 
        stringToken.setLength(0); 
         } 
      } 
     } 
    } 
public static void main(String[] args){ 
    if(args.length!=1) 
     System.out.println("Enter only one line string"); 
    else{ 
     StringTokens st = new StringTokens(); 
     st.display(args[0]); 
     }  
    } 
} 

私は唯一の特殊文字を取得していますこのコードを実行する私のコード

です。

答えて

1

私は評判が必要ないのでコメントできません。現在、特殊文字を表すstr [j]を追加しています。代わりに、string.charAt(i)を追加する必要があります。希望が役立ちます。

stringToken.append(str[j]); 

stringToken.append(string.charAt(i)); 
+0

Oooopss !!!うん、あなたは正しいです、それは愚かなものです! :) –

+1

それでも正しいとは言えません。内側のループのために、正しいcharを複数回( 'str.length'回)追加します。 – Hulk

+0

@Hulk真。しかし、彼はなぜ特殊文字だけを取得しているのかを質問していたので、私はそれに答えました。コメントできなかったので、答えとして投稿しました。 – user3738243

2

一つの簡単な方法でなければなりません - は、すべての無効な文字を保持するを設定し使用します。

if(invaidChars.contains(string.charAt(i)) { 
    ... invalid char 
} else { 
    valid char 
} 

Set<Character> invalidChars = new HashSet<>(Arrays.asList('$', ...)); 

を次に、あなたのチェックがに沸きます

もちろん、それはまだあなたが車輪を再発明していることを意味します。そして誰かが非常に良い理由があれば、ホイールを再発明するだけです。 1つの正当な理由は、あなた自身のソリューションを実装することです。

それ以外の場合:ちょうど約replaceAllを読んでください。そのメソッドはあなたの現在のコードを正確に行います。私の解決策はやっているだろう。しかし、まっすぐ進む方法で。すべての良いJavaプログラマが理解できるようになる!

したがって、に一致するとあなたの質問:はい、これを自分で実装することができます。しかし、次のステップは、問題に対する「標準的な」解決方法を理解することです。あなたがJavaを学ぶときには、でもは、問題を解決するためのコード量を最小限に抑えて、「みんなのように」のやり方を学ぶことに集中する必要があります。それはコアのうちの1つです Javaの美しさ:すべての問題の99%について、そこにはまっすぐな、高性能な、皆が理解できる解決策があります。最も頻繁に直接Java標準ライブラリ自体に!そして、Javaを知ることは、それらの解決策を理解し理解することを意味します。

すべてのCコーダーは、150行の低レベル配列反復コードをJavaでも置くことができます。 真実美徳は、5行または10行で同じことをする方法を知ることです!

+0

replaceAll以外の可能なAPIを教えてもらえますか? –

1

ここにコードの修正版がありますが、この問題の解決策があります。

public class StringTokens { 

    static String specialChars = new String(new char[]{' ', '!', ',', '?', '.', '_', '@'}); 

    public static void main(String[] args) { 
     if (args.length != 1) { 
      System.out.println("Enter only one line string"); 
     } else { 
      display(args[0]); 
     } 
    } 

    public static void display(String string) { 
     StringBuilder stringToken = new StringBuilder(); 
     stringToken.setLength(0); 
     for(char c : string.toCharArray()) { 
      if(!specialChars.contains(String.valueOf(c))) { 
       stringToken.append(c); 
      } else { 
       stringToken.append('\n'); 
      } 
     } 
     System.out.println(stringToken); 
    } 
} 
0
public static void main(String[] args) { 
    String a=",[email protected]_."; //Add other special characters too 
    String test="[email protected],2016!horrible_just?kidding"; //Make this as user input 
    for(char c : test.toCharArray()){ 
     if(a.contains(c+"")) 
     { 
      System.out.println(); //to avoid printing the special character and to print newline 
     } 
     else{ 
      System.out.print(c); 
     } 
    } 
} 
0

あなたは、単純なループを実行し、各文字のASCII値を確認することができます。 A-Zとa-zの改行以外の文字が文字をスキップして移動した場合。時間の複雑さはO(n)+余分なクラスが使用されなくなります。

 String str = "[email protected],2016!horrible_just?kidding"; 

     char charArray[] = str.toCharArray(); 

     boolean flag=true;; 
     for (int i = 0; i < charArray.length; i++) { 
      int temp2 = (int) charArray[i]; 

      if (temp2 >= (int) 'A' && temp2 <= (int) 'Z') { 
       System.out.print(charArray[i]); 
       flag=true; 
      } else if (temp2 >= (int) 'a' && temp2 <= (int) 'z') { 
       System.out.print(charArray[i]); 
       flag=true; 
      } else { 
       if(flag){ 
        System.out.println(""); 
        flag=false; 
       } 
      } 
     } 
関連する問題