Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用stream比较和操作一个列表中的两个相邻元素?_Java_Java 8_Java Stream - Fatal编程技术网

如何在Java中使用stream比较和操作一个列表中的两个相邻元素?

如何在Java中使用stream比较和操作一个列表中的两个相邻元素?,java,java-8,java-stream,Java,Java 8,Java Stream,背景是我有两个字符串类型变量str1和str2作为输入。最后,我必须返回一个包含str1的连续前缀的列表,该前缀小于str2中的相关前缀 我有如下Java代码: public List<Character> getPrefix(String str1, String str2) { int index = 0; List<Character> res = new ArrayList<>(); //str1 = "1243" //

背景是我有两个字符串类型变量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>
public List getPrefix(字符串str1、字符串str2){
int指数=0;
List res=new ArrayList();
//str1=“1243”
//str2=“2324”
//答案是“12”。

而(index
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());
    }
}

看看代码,也许这就是你想要的。 尽管如此,它仍然可以得到更多的增强,并且不能解决第一个字符串以大于第二个的值开头的情况。这也可以实现,但需要额外的工作。 (无法一件一件地完成,因为供应商消耗了一个元素进行检查,以连接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());
    }
}
你可以:

  • 生成索引流
  • 使用索引获取两个字符串的字符
  • 选择有效字符

    // 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());
    
    }
    
    //魔法
    公共静态列表getPrefix(字符串str1、字符串str2){
    返回IntStream
    .range(0,数学最小值(str1.length(),str2.length())
    .mapToObj(i->newchar[]{str1.charAt(i),str2.charAt(i)})
    .takeWhile(a->a[0]a[0])
    .collect(Collectors.toList());
    }
    
  • 你可以:

  • 生成索引流
  • 使用索引获取两个字符串的字符
  • 选择有效字符

    // 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());
    
    }
    
    //魔法
    公共静态列表getPrefix(字符串str1、字符串str2){
    返回IntStream
    .range(0,数学最小值(str1.length(),str2.length())
    .mapToObj(i->newchar[]{str1.charAt(i),str2.charAt(i)})
    .takeWhile(a->a[0]a[0])
    .collect(Collectors.toList());
    }
    

  • 好的解决方案,谢谢你的回答。好的解决方案,谢谢你的回答。