在java中,递归地将字符串附加到字符串列表
我有一个字符串列表,我想在列表中的每个字符串前面添加文本。我试图在不使用for/Iterator循环的情况下实现这一点,就像一行代码一样。我找不到解决这个问题的办法 下面我尝试了一个for循环,但需要没有这个的解决方案。有解决办法吗在java中,递归地将字符串附加到字符串列表,java,list,arraylist,Java,List,Arraylist,我有一个字符串列表,我想在列表中的每个字符串前面添加文本。我试图在不使用for/Iterator循环的情况下实现这一点,就像一行代码一样。我找不到解决这个问题的办法 下面我尝试了一个for循环,但需要没有这个的解决方案。有解决办法吗 List<String> strings = new ArrayList<String>(); strings.add("a"); strings.add("b");
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);
}
请帮忙。谢谢。也许是这样的吧
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");
这更像是一个函数式的解决方案,上面代码的问题是,字符串将在类中被销毁。如果希望避免这种情况,可以在调用递归操作之前进行深度复制 您可以使用Google Guava之类的库编写一个“功能风格”版本。但这通常被视为不如循环更可取/更清晰
List<String> results = Lists.transform( inputs, new Function<String,String() {
public String apply (String input) {
return "D"+input;
}
};
这是为GoogleGuava编写的,但Apache也有一个“功能性”风格的库
实际上,在字符串上添加一个公共前缀的用例不是很好。用户不希望看到每个项目上都有多余的前缀。。在UI中,前缀应在标题中显示一次。第一个想法:LINQ:
对于Java,似乎有两种LINQ替代方案,请参见:在这里,您可能会幸运地找到一些可以工作的东西
我将为您提供几个可能无法测试的示例:
兰姆达斯
使用的转换功能,我想这样的功能应该可以工作:
List<String> res = extract(strings, on(String.class).toString() + "D");
软泥灯
位于。根据所提供的样本,类似这样的方法也可能有效:
List<String> res = strings.select(append("D")).toList();
如果您使用的是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);
}
}
即使您现在没有使用Java8,也应该注意到这些特性已经添加,如果您在一两年内遇到类似的问题,那么您可以使用新API中的一些东西 为什么??如果有的话,它的可读性就会差得多。你提出的技术似乎对大多数目的都没有用处。你能解释一下你为什么要这么做吗?这是家庭作业吗?不,这不是家庭作业,但我的一位同事想知道这是否可行。类似appendedList=StringUtils.appendx,stringsyou可以通过新的ArrayListstrings传入列表,但ok..您希望在每个字符串前面追加文本。如果在前端添加内容,则称为前置。这是避免循环的一个很好的答案-用递归替换它!但是您忘记了实际转换数据。您也可以在scala中轻松实现这一点,比如strings.asScala.mapD+\uJava。您必须导入scala.collection.JavaConverters。就执行速度而言,这个解决方案比循环快吗?@seinecle-我猜它是通过某种循环在内部实现的,但它仍然会在每个迭代中增加至少一个额外的函数调用lambda,所以我猜它会更慢。但是,我不确定Hotspot编译器在内联lambda方面有多好,所以如果这是在代码的关键区域,使用这个vs a循环可能会编译成类似的机器代码。
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);
$ java StringTest
[Da, Db, Dc, Dd]