4

文字列のリストがあり、リスト内の各文字列の前にテキストを追加したいと考えています。単一行のコードのような for/Iterator ループなしでこれを達成しようとしています。これに対する解決策が見つかりません。

以下に for ループを試してみましたが、これなしで解決策が必要です。解決策はありますか?

   List<String> strings = new ArrayList<String>();
                strings.add("a");
                strings.add("b");
                strings.add("c");
            strings.add("d");

List<String> appendedList = new ArrayList<String>();
for (String s : strings) {
    appendedList.add("D" + s);
}

助けてください。ありがとう。

4

4 に答える 4

9

Java 8 を使用している場合は、新しく追加されたreplaceAllメソッドを使用してこれを行うことができます。

strings.replaceAll(s -> "D"+s);

完全な動作例を次に示します。

import java.util.Arrays;
import java.util.List;

public class StringTest {
  public static void main(String[] args) {
    List<String> strings = Arrays.asList("a", "b", "c", "d");
    strings.replaceAll(s -> "D"+s);
    System.out.println(strings);
  }
}

新しい Streams API を使用してこれを行うこともできますが、少し冗長に、元のリストを変更 (更新) する代わりにリストのコピーを作成します。

List<String> strings = Arrays.asList("a", "b", "c", "d");
strings = strings.stream()
                 .map(s -> "D"+s) // Using Lambda notation to update the entries
                 .collect(Collectors.toList());
System.out.println(strings);

Arrays.asList()以前はより簡潔にリストを作成していたことに注意してください。これは Java 8 の新機能ではないため、Java 5/6/7 でも使用できるはずです。これが私の出力です:

$ java StringTest
[Da, Db, Dc, Dd]

現在 Java 8 を使用していない場合でも、これらの機能が追加されていることに注意してください。1、2 年後に同様の問題が発生した場合は、新しい API の何かを使用できます!

于 2013-09-27T00:45:59.857 に答える
2

このようなものはおそらく

public List<String> recursiveAdd(List<String> strings, List<String> finalList, String prepender){
   if(strings == null || strings.size() == 0) return finalList;
   else{
       finalList.add(prepender + strings.remove(0));
       return recursiveAdd(strings,finalList,prepender);
   }
} 

strings = recursiveAdd(strings, new ArrayList<String>(), "D");

これはより機能的な解決策です。上記のコードの問題は、文字列がクラス内で破棄されることです。これを回避したい場合は、再帰操作を呼び出す前にディープ コピーを作成できます。

于 2013-09-26T23:36:54.627 に答える
1

最初の考え:LINQ :)

Java 用の LINQ の代替手段がいくつかあるようです (参照: LINQ に相当する Java はありますか?およびLINQ に相当する Java は何ですか? )。

動作する可能性がある (テストされていない) 例をいくつか紹介します。

ラムダJ

LambdaJの変換機能を使用すると、次のようなものが機能するはずです。

List<String> res = extract(strings, on(String.class).toString() + "D");

JPropel-ライト

githubにあります。提供されたサンプルに基づいて、次のようなものも機能する可能性があります。

List<String> res = strings.select(append("D")).toList();
于 2013-09-26T23:54:24.247 に答える
0

Google Guava などのライブラリを使用して、「関数型」バージョンを作成できます。しかし、これは一般に、単なるループよりも優先度が低く、明確ではないと見なされています。

List<String> results = Lists.transform( inputs, new Function<String,String() {
    public String apply (String input) {
        return "D"+input;
    }
};

これは Google Guava 用にコーディングされていますが、Apache にも「機能的な」スタイル ライブラリがあります。

実際には、文字列に共通のプレフィックスを追加するこのユースケースはあまり良くありません。ユーザーは、すべてのアイテムに冗長なプレフィックスが表示されることに関心がありません。UI では、プレフィックスはヘッダーに 1 回表示する必要があります。

于 2013-09-26T23:39:23.017 に答える