8

私は反復することに興味があります(再:目的を見つけて置き換えます)、言います:

List<String> someList = new ArrayList<String>();

ここで、someListは以前のメソッドですでに入力されており、たとえば[a:bX、b:Xc]のように、いくつかの要素で構成されています。

ここで、対象の検索と置換の文字列は次のようになります。

String someString = "X";
String otherString = "Y";
String contentsTBD = "";

さて、理想的には、次のようにsomeListを繰り返すことができると思いました。

public void readAndReplace() {
    for (int i = 0; i < someList.size(); i++) {
        if (someList.get(i).contains(someString)) {
            someList.get(i).replace(someString, otherString);
        } else {
            ++i;
        }
    }
    System.out.print(someList);
}

ここで、プリントアウトは次のようになります。

[a:bY, b:Yc]  

次に、これが機能する可能性があると思いました。

public void readAndReplace() {
    for (String s : someList) {
        contentsTBD += s;
    }
    for (int i = 0; i < contentsTBD.length(); i++) {
        if (contentsTBD.contains(someString)) {
            contentsTBD.replaceAll(someString, otherString);
        } else {
            ++i;
        }
    }
    System.out.print(contentsTBD);
}

しかし、私への言及が失われたため、これは無意味であることにすぐに気づきました。どんなアドバイスも本当に役に立ちます。ありがとうございました。

4

7 に答える 7

9
  • まず、置換された文字列をどこにも保存していません。風と共に去りぬ。

  • 次に、置換によって既存のリストが変更されることはありません。従来のforループを使用しているため、新しい文字列を既存の場所に設定する必要があります。または、新しいリストを作成し、addそのリストの値を変更することもできます。

  • StringJavaでは不変であるため、Stringクラスのすべてのメソッドが新しい文字列を返すことを忘れないでください。既存のものを変更することはありません。したがって、返された文字列を新しい文字列に再割り当てする必要があります。

このコードを試してみてください:-

 public void readAndReplace()
    {
      // You can also create a new list out of the existing list.
      // That way, you won't need to modify the existing one.
      List<String> newList = new ArrayList<String>();
      for(int i = 0; i < someList .size(); i++)
      {
          if(someList.get(i).contains(someString))
          {
              newList.add(someList.get(i).replace(someString, otherString));
             //someList.set(i, someList.get(i).replace(someString, otherString));
          } else {

              // If it not contains `someString`, add it as it is to newList
              newList.add(someList.get(i));
          }

       }
       System.out.println(someList);  // Original
       System.out.println(newList);   // New List

    }
于 2012-10-12T05:46:54.163 に答える
7

MadProgrammerの提案の後、追加の説明を編集しました。

ポイント1StringImmutable、であり、文字列を変更しようとしていますが、someList.get(i).replace(someString, otherString);それは機能しますが、内部に反映されないためsomeList、someListを反映するために呼び出す必要がありますsomeList.set(i)

ポイント2:あなたはすでに内部にいるのであなたのelseブロックは役に立たないincrementingifor loop

これを試して。

  String oldStr="";
    for (int i = 0; i < someList.size(); i++) {
        if (someList.get(i).contains(someString)) {
            oldStr = someList.get(i).replace(someString, otherString);
            someList.set(i, oldStr);
        } 
    }
    System.out.print(someList);

JavaimmutableでImmutableがどのように機能するかをご覧ください

于 2012-10-12T05:52:02.137 に答える
5

この質問はかなり古いことは知っていますが、私は同じものを探していて、他の人のために見つけたものを追加すると思いました。

これを行うために私が見つけた最も簡単な方法は、特にリストを操作するためのIteratorのサブインターフェイスであるListIteratorクラスを使用することです。これにより、この種の操作は非常に簡単になります。

public void replace(List<String> list) {
    ListIterator<String> it = list.listIterator();
    while(it.hasNext()) {
        it.set(it.next().replace("old_text","new_text"));
    }
}

これにより、インデックスを操作する必要がなくなります。

于 2016-08-17T14:42:39.463 に答える
2

問題は、文字列が不変であるため、リスト内のインプレースで変更されておらず、更新する必要があることです。

someList.set(i, someList.get(i).replace(someString, otherString);

elseブロックも必要ありません。そうしないと、もう1つの要素をスキップします。

于 2012-10-12T05:45:27.067 に答える
2

あなたの問題は、文字列が不変である(つまり、内容を変更できない)という事実に関係していると思います。

最初の例のこのステートメントは、実際には何もしません...

someList.get(i).replace(someString, otherString);

私はおそらく次のようなことをします

for(int i = 0; i < someList .size(); i++)
{
    String value = someList.get(i);
    if(value.contains(someString))
    {

      value = value.replace(someString, otherString);

      someList.set(i, value);

    }
}

iまた、なぜあなたがelse条件でインクリメントしているのかわかりません

于 2012-10-12T05:47:24.540 に答える
0

最初のアプローチの問題は何ですか?
elseブロックを削除すれば機能するはずです(「i」はすでにforループによってインクリメントされます)。

また、2番目のアプローチは意味がありません。増分する場合を除いて、内側のforループ内でiを使用していません。これは必須ではありません(そうですか?)

于 2012-10-12T05:37:01.380 に答える
0

あなたはこのようなことを試すことができます:

  1. 最初にArrayList内に値を格納します。
  2. Genericsを使用しているので、Iteratorを使用します。

    List<String> somelist = new ArrayList<String>();
    
    someList.add("Y");
    someList.add("X");
    someList.add("Z");
    
    Iterator itr = someList.iterator();
    while(itr.hasNext){
    String a = itr.next();
    String b = "Y";
    
    if(a.contains(b)){
    String c = b.replace("A");
    System.out.println(c);
    
    }
    else{
    System.out.println(b);
    
    }
    
于 2012-10-12T06:08:45.430 に答える