Java 同时遍历2个列表

Java 同时遍历2个列表,java,for-loop,java-8,iterator,java-stream,Java,For Loop,Java 8,Iterator,Java Stream,我正在尝试将下面的代码转换为Java8(使用streams),但不确定如何使用streams一起迭代两个列表 public class ComparisonString { private static List<String> input; public static void main(String[] args) { input = Arrays.asList("TRUE","FALSE","T

我正在尝试将下面的代码转换为Java8(使用streams),但不确定如何使用streams一起迭代两个列表

public class ComparisonString {
    private static List<String> input;

    public static void main(String[] args) {
        input = Arrays.asList("TRUE","FALSE","TRUE","N/A");
        ComparisonString cs = new ComparisonString();
        System.out.println(cs.getMatchedOutput(Arrays.asList("TRUE","N/A","N/A","FALSE")));

    }
    /**
     * Check whether the 'input' List and the 'givenInput' List match.
     * If a value is "N/A" in either lists then it means does-not-matter/don't-check-for-a-match-and-go-next
     * @param givenInput
     * @return
     */
    public Optional<String> getMatchedOutput(final List<String> givenInput) {
        boolean flag = true;
        for (int i = 0; i < givenInput.size(); i++) {
            if (this.input.get(i) != null
                    && !(this.input.get(i).equalsIgnoreCase("N/A")
                    || givenInput.get(i).equalsIgnoreCase("N/A"))
                    && !this.input.get(i).equalsIgnoreCase(givenInput.get(i))) {
                flag = false;
                break;
            }
        }
        if (flag) {
            return Optional.of("flag = true");
        } else {
            return Optional.empty();
        }
    }
}
公共类比较安装{
私有静态列表输入;
公共静态void main(字符串[]args){
输入=数组.asList(“真”、“假”、“真”、“不适用”);
ComparisonString cs=新的ComparisonString();
System.out.println(cs.getMatchedOutput(Arrays.asList(“TRUE”、“N/A”、“N/A”、“FALSE”));
}
/**
*检查“输入”列表和“给定输入”列表是否匹配。
*如果任一列表中的值为“N/a”,则表示无所谓/不检查匹配和下一步
*@param givinput
*@返回
*/
公共可选getMatchedOutput(最终列表给定输入){
布尔标志=真;
for(int i=0;i
很遗憾,您不能使用流同时处理两个列表。您可以做的是使用迭代器。我试着写了一些代码,应该是这样的:

publicstaticvoidstreamtest(列表给定列表){
列表测试=新建ArrayList();
IntStream.range(0,givenList.size())
.parallel()
.forEach(i->{
if(input.get(i)!=null
&&!(input.get(i).equalsIgnoreCase(“N/A”)
||givenList.get(i).equalsIgnoreCase(“不适用”)
&&!input.get(i).equalsIgnoreCase(givenList.get(i)))
测试。添加(“假”);
});
if(testing.isEmpty())
System.out.println(“flag=true”);
其他的
System.out.println(“flag=false”);
}

我希望这能帮助您并给您一个开始。

不幸的是,您不能使用流同时处理两个列表。您可以做的是使用迭代器。我试着写了一些代码,应该是这样的:

publicstaticvoidstreamtest(列表给定列表){
列表测试=新建ArrayList();
IntStream.range(0,givenList.size())
.parallel()
.forEach(i->{
if(input.get(i)!=null
&&!(input.get(i).equalsIgnoreCase(“N/A”)
||givenList.get(i).equalsIgnoreCase(“不适用”)
&&!input.get(i).equalsIgnoreCase(givenList.get(i)))
测试。添加(“假”);
});
if(testing.isEmpty())
System.out.println(“flag=true”);
其他的
System.out.println(“flag=false”);
}

我希望这能帮助您并给您一个开始。

可以使用
IntStream
为两个列表生成索引流,然后过滤掉不相关的列表值并匹配其余的列表值:

public可选getMatchedOutput(最终列表给出输入){
返回IntStream.range(0,givenInput.size())
.filter(i->null!=input.get(i)&&null!=givinput.get(i))
.filter(i->!“N/A”.equalsIgnoreCase(输入.获取(i))&&!“N/A”.equalsIgnoreCase(给定输入.获取(i)))
.allMatch(i->input.get(i).equalsIgnoreCase(givinInput.get(i)))
?可选。of(“标志=真”)
:可选。空();
}
测试已知数据:

input=Arrays.asList(“真”、“假”、“真”、“不适用”);
ComparisonString cs=新的ComparisonString();
System.out.println(cs.getMatchedOutput(Arrays.asList(“TRUE”、“N/A”、“N/A”、“FALSE”));
印刷品:

Optional[flag = true]

可以使用
IntStream
为两个列表生成索引流,然后过滤掉不相关的列表值并匹配其余的值:

public可选getMatchedOutput(最终列表给出输入){
返回IntStream.range(0,givenInput.size())
.filter(i->null!=input.get(i)&&null!=givinput.get(i))
.filter(i->!“N/A”.equalsIgnoreCase(输入.获取(i))&&!“N/A”.equalsIgnoreCase(给定输入.获取(i)))
.allMatch(i->input.get(i).equalsIgnoreCase(givinInput.get(i)))
?可选。of(“标志=真”)
:可选。空();
}
测试已知数据:

input=Arrays.asList(“真”、“假”、“真”、“不适用”);
ComparisonString cs=新的ComparisonString();
System.out.println(cs.getMatchedOutput(Arrays.asList(“TRUE”、“N/A”、“N/A”、“FALSE”));
印刷品:

Optional[flag = true]

您可以使用另一种可能的解决方案。它看起来像
python
zip
函数

公共类比较安装{
私有静态列表输入;
公共静态void main(字符串[]args){
输入=数组.asList(“真”、“假”、“真”、“不适用”);
ComparisonString cs=新的ComparisonString();
System.out.println(cs.getMatchedOutput(
数组。asList(“真”、“不适用”、“不适用”、“假”);
}
公共可选getMatchedOutput(最终列表给定输入){
boolean notFlag=IntStream.range(0,input.size())
//压缩到新对象
.mapToObj(i->新对(input.get(i),givenInput.get(i)))
//当发现错误标志时停止
.anyMatch(p->{
字符串inputValue=p.getKey();
字符串givenValue=p.getValue();
//真的会断流
返回inputValue!=null
&&!(“不适用”。相等信号情况(输入值)
||“不适用”。相等信号情况(给定值))