只要这个问题仍然无法解决OP的问题并且Java多年来发展了,我就决定提出我自己的问题。
为了清楚起见,我们将输入String数组更改为具有5个唯一项。
String[] elements = {"a", "b", "c", "d", "e"};
您要访问列表中的两个同级,每个迭代以一个索引递增。
for (int i=0; i<elements.length-1; i++) {
String left = elements[i];
String right = elements[i+1];
System.out.println(left + " " + right);
}
打印对左,右四个迭代导致线a b
,b c
,c d
,d e
在控制台。
如果输入字符串数组的元素少于2个,会发生什么?只要此for循环始终提取两个同级节点,什么都不会打印。如果少于2个元素,则程序本身不会进入循环。
就您的代码片段而言,假设您不希望舍弃提取的值,而是将它们添加到另一个变量中(假设在for循环范围之外),则希望将其存储在列表或数组中。假设您想将兄弟姐妹与+
角色连接起来。
List<String> list = new ArrayList<>();
String[] array = new String[elements.length-1];
for (int i=0; i<elements.length-1; i++) {
String left = elements[i];
String right = elements[i+1];
list.add(left + "+" + right);
array[i] = left + "+" + right;
}
同时打印列表和数组(Arrays.toString(array)
)的内容将导致:
[a+b, b+c, c+d, d+e]
Java 8
从Java 8开始,您可能会想利用Stream API的优势,但是,它是为处理源集合中的各个元素而设计的。没有这样的方法可同时处理2个或更多同级节点。
唯一的方法是使用Stream API代替处理索引并将它们映射到实际值。只要从一个称为Stream的原始Stream开始,IntStream
就需要使用IntStream::mapToObj
method进行装箱Stream<T>
:
String[] array = IntStream.range(0, elements.length-1)
.mapToObj(i -> elements[i] + "+" + elements[i + 1])
.toArray(String[]::new);
List<String> list = IntStream.range(0, elements.length-1)
.mapToObj(i -> elements[i] + "+" + elements[i + 1])
.collect(Collectors.toList());