Java 迭代两个相关数组列表的有效方法?
我正在寻找一种干净简单的方法来迭代两个ArrayList,这两个ArrayList直接相关,其中一个的每个索引映射到另一个的索引(在关系中) 目前,我正在通过一个简单的Java 迭代两个相关数组列表的有效方法?,java,list,loops,collections,Java,List,Loops,Collections,我正在寻找一种干净简单的方法来迭代两个ArrayList,这两个ArrayList直接相关,其中一个的每个索引映射到另一个的索引(在关系中) 目前,我正在通过一个简单的for循环来实现这一点,我尝试查看lambdas和for每个循环,但没有找到一种方法可以同时将其应用于大小相同的两个列表 第一个列表:[“蓝色”、“红色”、“绿色”] 第二个列表:[“天空”、“玫瑰”、“草”] for(int i=0;i System.out.println(String.format(“%s%s”、firstL
for
循环来实现这一点,我尝试查看lambdas和for每个
循环,但没有找到一种方法可以同时将其应用于大小相同的两个列表
第一个列表:[“蓝色”、“红色”、“绿色”]
第二个列表:[“天空”、“玫瑰”、“草”]
for(int i=0;i
结果:
Blue Sky
Red Roses
Green Grass
是否有一种方法可以有效地同时对两个列表进行迭代,对每个循环使用lambda或
,以避免对
循环使用。但是,这类场景:
我正在寻找一种干净简单的方法来迭代两个ArrayList
它们直接相关,因为每个索引都映射到该索引
指另一个人(在关系中)
通常需要定义关系的类,在您的情况下:
public class MyC {
private final String color;
private final String object;
public MyC(String color, String object) {
this.color = color;
this.object = object;
}
public String getColor(){
return color;
}
public String getObject(){
return object;
}
@Override
public String toString() {
return "MyC{" +
"color='" + color + '\'' +
", object='" + object + '\'' +
'}';
}
}
然后这两个列表将成为一个:
List<MyC> list = List.of(new MyC("Blue", "Sky"), new MyC("Red", "Roses"), new MyC("Green", "Grass") );
可以使用“range”语句使用lambda表达式迭代索引
像这样:
List<String> firstList = Arrays.asList("Blue","Red","Green");
List<String> secondList = Arrays.asList("Sky","Roses","Grass");
IntStream
.range(0, firstList.size())
.forEach(index ->
System.out.println(String.format("%s %s", firstList.get(index), secondList.get(index)))
);
List firstList=Arrays.asList(“蓝色”、“红色”、“绿色”);
List secondList=Arrays.asList(“天空”、“玫瑰”、“草”);
IntStream
.range(0,firstList.size())
.forEach(索引->
System.out.println(String.format(“%s%s”、firstList.get(index)、secondList.get(index)))
);
这基本上是相同的方法——只使用lambdas
摆脱基于索引的访问的唯一方法是使用不同的数据结构或使用交替迭代技术,如其他答案所示。如果您的目的是避免使用for
循环,则可以尝试以下方法:
Iterator Iterator=secondList.Iterator();
firstList.forEach(s->System.out.println(s+“”+iterator.next());
甚至可以添加到StringBuilder
,然后在最后显示结果。正确:当一对数组的循环工作时,您应该通过定义自己的类来利用Java作为OOP语言
记录
使用新特性,在Java16中定义这样的类更加简单。当类的主要目的是以透明和不变的方式传输数据时,将其作为记录编写
默认情况下,记录非常简短。编译器隐式地创建构造函数、getter、equals
&hashCode
和toString
。您只需声明每个成员字段的类型和名称
record ColorNoun ( String color , String noun ) {}
像传统课堂一样使用唱片。使用new
实例化
ColorNoun blueSky = new ColorNoun ( "Blue" , "Sky" ) ;
请注意,记录可以在方法中本地声明,也可以像常规类一样单独声明。所有其他答案都是正确的,首选的解决方案应该始终是@Basil Bourque所示的解决方案,但正如其他人在注释中指出的那样,使用索引迭代非基于数组的列表不是很有效。但是,使用迭代器进行迭代(每个实现都可以提供有效的实现)应该是可行的
下面是一个示例,说明如何使用2个列表的迭代器对其进行迭代:
导入java.util.array;
导入java.util.Iterator;
导入java.util.List;
导入java.util.function.BiConsumer;
公共类IterateTolistsExample{
公共静态void main(字符串[]args){
List firstList=Arrays.asList(“蓝色”、“红色”、“绿色”);
List secondList=Arrays.asList(“天空”、“玫瑰”、“草”);
forEach(firstList,secondList,(first,second)->System.out.printf(“%s%s%n”,first,second));
}
public static void forEach(ListStreams和lambdas在
循环方面肯定比更糟糕。也许没有我,一位曾经激烈且不悔改的反streams活动家所想的那么糟糕。也许只是稍微差一点。但是更糟。人们继续使用System.out.println(String.format(…)的原因是什么
而不是System.out.printf(…)
?使用“%s%s”
的格式设置并不是比更简单、更高效的firstList.get(index)+“+secondList.get(index)
的改进。
ColorNoun blueSky = new ColorNoun ( "Blue" , "Sky" ) ;