背景是我有两个String类型变量str1和str2作为输入。最后,我必须返回一个列表,该列表包含str1的连续前缀,该前缀小于str2中的相关前缀。
我有这样的Java代码:
public List<Character> getPrefix(String str1, String str2) {
int index = 0;
List<Character> res = new ArrayList<>();
//str1 = "1243"
//str2 = "2324"
// The answer will be "12".
while (index < str1.length() && index < str2.length() && str1.charAt(index) <= str2.charAt(index)) {
res.add(str1.charAt(index));
index++;
}
return res;
}
//the return type could either be List<String> or List<Character>
我被要求在流中转换此代码,而不必在流方法中使用while或for循环。我打算像这样转换这段代码
List<String> list = new ArrayList<>();
list.add(str1);
list.add(str2);
List<String> res = list.stream()
.filter()
.reduce();
我发现filter()
方法可以选择与给定谓词匹配的元素,而reduce()
方法可以使用标识和累加器获得一个最终结果。
但是我发现我既无法操作一个列表中的两个相邻元素,也无法获得一个指针来比较和遍历列表中每个元素(该元素为String类型)。
有什么办法可以操作一个列表中的两个相邻元素,以便比较它们在相同位置的字符。
答案 0 :(得分:2)
您可以:
在有效时选择字符
// The magic
public static List<Character> getPrefix(String str1, String str2) {
return IntStream
.range(0, Math.min(str1.length(), str2.length()))
.mapToObj(i -> new char[] { str1.charAt(i), str2.charAt(i) })
.takeWhile(a -> a[0] < a[1])
.map(a -> a[0])
.collect(Collectors.toList());
}
答案 1 :(得分:0)
看看代码,也许这就是您想要的。 仍然可以进一步增强它,并且不能解决第一个字符串大于第二个字符串的情况。这也可以实现,但需要额外的工作。 (无法一一完成,因为供应商消耗一个元素来进行dropWhile和takeWhile连锁检查)。 只需使用供应商,您就可以将流中的元素与其他数据结构中的元素进行比较。
import java.util.LinkedList;
import java.util.function.Supplier;
import java.util.stream.Collectors;
public class Pre1 {
public static void main(String[] args) {
System.out.println(new Pre1().getPre("1234", "2315"));
System.out.println(new Pre1().getPre("941234", "712315"));
System.out.println(new Pre1().getPre("2345", "341"));
}
public String getPre(String s1, String s2) {
//second list is used as supplier
LinkedList<Integer> l2 = s2.chars().boxed()
.map(t->Character.getNumericValue(t))
.collect(Collectors.toCollection(LinkedList<Integer>::new));
//l2.forEach(System.out::println);
Supplier<Integer> supplier = () -> {
// System.out.println(l2.peek());
return l2.isEmpty() ? 0 : l2.pollFirst();
};
return s1.chars().boxed()
.map(t->Character.getNumericValue(t))
.takeWhile(t->t<supplier.get())
.map(t->String.valueOf(t))
.collect(Collectors.joining());
}
}
输出
12
nothing
23