2012-02-11 3 views
1

宿題のこの部分は、文字列の集合を取ることを望んでおり、文字列のリストを返します。文字列セットには、電子メールアドレス、つまり[email protected]があります。私たちは電子メールアドレスの最初の部分を引っ張ります。その名前をString Listに入れます。上記の例では、mynameがListに追加されます。 私が現在持っているコードは、イテレータを使用して文字列をセットから取得します。次に、String.contains( "@")をエラーチェックとして使用して、文字列に@記号が含まれていることを確認します。次に、文字列の最後から文字列.charAt( "@")を使用して各文字をチェックします。それが見つかったら、正しい部分を含む部分文字列を作成してListに送ります。 私の問題は、何かを再帰的に使用して操作を減らそうとしていたことです。私はstring.length()/ 2を分割して、後半にString.contains( "@")を使用することを考えていました。その半分に@記号が含まれている場合、関数は再帰的にaginを呼び出します。後半に@記号が含まれていなかった場合、前半にはそれがあり、再帰的に関数を呼び出すことになります。文字の最適化を見つけよう

私の問題は、再帰的に関数を呼び出し、@記号が見つかると「部分文字列」を送信するときに、元の文字列のインデックスではなく部分文字列のインデックスのみを持つことになります。どのようにそれを追跡するための任意のアイデアや多分コマンド/私は見ている必要がありますメソッド。以下は私の元のコードです。アドバイスを歓迎します。

public static List<String> parseEmail(Set<String> emails) 
    { 
     List<String> _names = new LinkedList<String>(); 
     Iterator<String> eMailIt=emails.iterator(); 

     while(eMailIt.hasNext()) 
     { 
      String address=new String(eMailIt.next()); 
      boolean check=true; 
      if(address.contains("@"))//if else will catch addresses that do not contain '@' . 
      { 
       String _address=""; 
       for(int i=address.length(); i>0 && check; i--) 
       { 
       if('@'==address.charAt(i-1))  
       { 
        _address=new String(address.substring(0,i-1)); 
        check=false; 
       } 
       } 
       _names.add(_address); 
       //System.out.println(_address);//fill in with correct sub string 
      } 
      else 
      { 
       //System.out.println("Invalid address"); 
       _names.add("Invalid address");//This is whats shownn when you have an address that does not have an @ in it. 
      }        // could have it insert some other char i.e. *%# s.t. if you use the returned list it can skip over invalid emails 
     } 
     return _names; 
    } 

**これは、私がString.indexOf(「@」)を使用しますが、APIによると、この方法が唯一のシンボルの最初の発生をバック与え、私はそこにできることを前提に仕事をしなければならないことが示唆されましたアドレスに複数の "@"を付ける必要があり、最後のものを使用する必要があります。しかし、提案していただきありがとうございます。他の提案を見て、報告します。

***したがって、string.lastindexOf()があり、それが必要なものでした。

public static List<String> parseEmail(Set<String> emails) 
    { 
     List<String> _names = new LinkedList<String>(); 
     Iterator<String> eMailIt=emails.iterator(); 

     while(eMailIt.hasNext()) 
     { 
      String address=new String(eMailIt.next()); 
      if(address.contains("@"))//if else will catch addresses that do not contain '@' . 
      { 
       int endex=address.lastIndexOf('@'); 
       _names.add(address.substring(0,endex-1)); 
//    System.out.println(address.substring(0,endex)); 
      } 
      else 
      { 
//    System.out.println("Invalid address"); 
       _names.add("Invalid address");//This is whats shownn when you have an address that does not have an @ in it. 
      }        // could have it insert some other char i.e. *%# s.t. if you use the returned list it can skip over invalid emails 
     } 
     return _names; 
    } 
+0

'eMailIt.next()'と 'address.substring(0、i-1)'はどちらも 'String'を返し、コード内で' new'演算子を呼び出す必要はありません。 – Gevorg

答えて

2

ホイールを再製作しないでください(もちろん、頼まない限り)。 JavaにはすでにString.indexOf(String str)を試用するための組み込み関数があります。これを使って。

final String email = "[email protected]"; 
final int atIndex = email.lastIndexOf("@"); 
if(atIndex != -1) { 
    final String name = email.substring(0, atIndex); 
} 
+0

私は、複数の@記号を持つアドレスを考慮に入れて、最後の文字列を文字列exに使用しなければなりません。 @ 123 @@ uark.comは@ 123 @を返します。 –

+0

ええと、電子メールの名前やドメインの部分で '@'が有効な文字であるかどうかはわかりませんが、これも可能です: 'indexOf'への呼び出しを別の標準JDK呼び出し - ' lastIndexOf'に置き換えてください。 – Perception

+0

私たちは行く....感謝感謝。それは私が必要と思うものです。私のコードを「スピードアップ」しないかもしれないが、その実装方法はわからないが、私の解析メールメソッドコードをよりきれいにするだろう。 –

0

再帰が宿題に指定されていない限り、あなたは最高のString.splitを覗くによって提供されるだろう。文字列をString配列に分割します(これを指定する場合は'@'になります)。電子メールアドレスの半分にアクセスできます。

+0

'String.split'は正規表現を使用します。 _IF_パフォーマンスは本当に重要であり(質問者がそうであることを暗示しています)、RegExpで何かを使うのは良いことではありません。 –

1

私はあなたがあなたがすべきその後、組み込み関数splitまたはindexOfを使用することを許可されている場合は、前の2つの答えに同意するものとします。しかし、あなた自身が部分文字列を見つける宿題の一部なら、文字列の文字を通り抜けて、見つけたときに停止してください直線検索

これを再帰的に実行しようとするのは間違いありません。分裂と征服という考えは、何も得られない状況で悪用されるべきではありません。再帰とは、関数呼び出しのオーバーヘッドを意味し、サブストリングが並行して検索された場合、単純なリニア検索より高速である可能性があります。それでもなお、同期のオーバーヘッドは、最も巨大な文字列以外のすべてのスピードアップを犠牲にするでしょう。

+0

再帰的にそれを行うhwの一部ではありません。私はちょうどそれがより効率的でより良い練習であると思った。 –

+0

+1の再帰部分 –

関連する問題