2017-02-11 22 views
0

目的は、文字列中の「zip」や「zap」のようなパターンを、 'z'で始まり 'p'で終わるものを探すことです。次に、そのような文字列すべてについて、中間の文字を削除します。文字列の複数の部分をリストに入れるにはどうすればよいですか?

私は、forループを使用して文字列の各文字をチェックし、それが 'z'に達すると、indexOf( 'p')を取得し、 ArrayList、indexOf( 'p')が見つかるように元の文字列から自身を削除します。

問題は、Javaをかなり新しくしているので、私はそれを行う方法を見つけることができないということです。誰もが:)私は感謝するだろう

を助けることができる場合、これはこれまでのところ私のコードです

package Homework; 

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.List; 

public class ZipZap { 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    List<String> list = new ArrayList<String>(); 

    System.out.print("Write a sentence with no spaces:"); 
    String sen = in.next(); 
    int len = sen.length(); 
    int p1 = sen.indexOf('p'); 
    String word = null; 
    String idk = null; 

    for(int i=0; i<len; i++){ 
     if(sen.charAt(i)=='z'){ 
      word = sen.substring(i, p1+1); 
      list.add(word); 
      idk = sen.replace(word,""); 
      i=0; 
     } 
    } 
} 

}

+0

おそらく、 'String'を単語の配列に分割するために' String#split'を見てみましょう。 – MadProgrammer

+0

String.splitを使用してすべての "z"を検索する方法についてはhttp://stackoverflow.com/questions/2206378 /分割する方法もありますが、区切り文字を保持することもできます)。リストの各単語について、2番目の位置のすべての文字を最初の "p"の前に置き換えます。 –

+0

文字 'z'の前に 'p'がある場合、このコードは失敗します。つまり、 "xxpxxzxxpxx"で失敗します。また、 "xxzxxpxxz"に失敗します。これはsen.indexOf( 'p')を1回だけ呼び出すためです。 'z'を見つけたらそれを呼び出す必要があります。また、2つの引数を取るindexOf()のバージョンを使用して、検索の開始位置として 'z'の位置を指定する必要があります。 –

答えて

1

使用この、ここで私はを使用しています "\ bz.p \ B"

String s ="Write a sentence with no zip and zap spaces:"; 
s=s.replaceAll("\\bz.p\\b", "zp"); 
System.out.println(s); 

出力との間にすることができるのpものとZと端で始まる文字を含む任意の単語を検索するためのパターン:

Write a sentence with no zp and zp spaces: 

またはそれはあなたの文字列

https://regex101.com/r/aKaNTJ/2

+0

クールリンク。 ***** –

+0

ありがとう@NickZiebert –

+0

多くの助けになるよ!ありがとう:) –

0

を確認することができ、ここで

s.replaceAll("z\\w+p", "zp"); 

することができ、私はあなたが入力zipzapityzoopは、例えば、変更されるべきであると言っていると思いますzpzpityzpiaooに入る。あなたの意図を誤解した場合は、私を修正してください。

あなたは途中であり、基本を理解しているようです。私が見る問題は軽微なものであるが、もちろん、あなたはそれらを修正したい:

  • @RicharsSchwartzはzipzapzoopなどのすべての文字列を検索するには、言及として、あなたはあなたが見つけるすべてのzpを見つける必要があります。インデックスizが見つかった場合はの後にpを見つけるためにsen.indexOf('p', i + 1)を使用します(2番目の引数はそのインデックスで検索を開始します)。
  • zが見つかるたびに、iを0に戻します。これは、文字列の先頭からやり直します。それをする必要はなく、あなたのプログラムは決して止まらないでしょう。
  • sen.substring(i, p1+1)は、iが欲しいと了解したときにzipのすべてを取り出します。引数をsubstring()に調整する必要があります。
  • sen.replace(word, "")を使用すると、すべての発生がwordに置き換えられます。だから、一度をzapから取り出すプログラムを修正したら、はzppzppaではなく)になり、azapzpになります。 Stringから部分文字列の特定の1つのオカレンスだけを簡単に削除する方法はありません。私は解決策は、StringBuilderクラスを使用することだと思います。それはdeleteメソッドを持っています。これは2つの指定されたインデックスの間の部分を削除します。これはあなたが必要とするものです(授業で学んだことのないクラスを使用するはずの宿題ですか?)
  • 最後に、変更した文字列を別の変数idkに代入していますが、引き続きsenを検索します。これは、,zipzpityzoopおよびzipzapityzpidkに順番に割り当てますが、決してzpzpityzpに割り当てるのと同じです。しかし、ちょうど私が提案したようにStringBuilderを使用している場合は、同じStringBuilderを使用しても問題ありません。

+0

ohhhh!あなたは人生の節約者です。どうもありがとうございます! –

関連する問題