以递归方式将字符串附加到java中的List of String

时间:2013-09-26 23:31:11

标签: java list arraylist

我有一个String列表,我想在列表中的每个String前面附加文本。我试图在没有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 个答案:

答案 0 :(得分:5)

如果您使用的是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,仍然可以注意到这些功能已添加,如果您在一两年内遇到类似问题,那么您可以使用新API中的内容!

答案 1 :(得分: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");

这是一个更实用的解决方案,上面代码的问题是,如果你想避免这种情况,在调用递归操作之前,你可以在类中销毁字符串,你可以进行深层复制!

答案 2 :(得分:1)

首先想到:LINQ:)

似乎有一些针对Java的LINQ替代方案(请参阅:Is there a Java equivalent for LINQ?What is the Java equivalent for LINQ?),您可能会很幸运找到有效的方法。

我将为您提供一些可能有效的示例(未经测试):

<强> LambdaJ

使用LambdaJ的转换功能,我想这样的事情应该有效:

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

<强> JPropel光强

位于github。根据提供的样本,这样的东西也可以起作用:

List<String> res = strings.select(append("D")).toList();

答案 3 :(得分: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中,前缀应在标题中显示一次。