我有一些包含一些组件的String数组,这个数组有5个组件,它有些不同。我想要做的是迭代该数组并获得第一个组件和该组件旁边的组件。所以我第一次得到组件编号1和组件编号2,第二次得到编号2和3,第三次得到编号3和4 ......依此类推,直到你到达最后一个组件。
我走了多远:
String[] elements = { "a", "a","a","a" };
for( int i = 0; i <= elements.length - 1; i++)
{
// get element number 0 and 1 and put it in a variable,
// and the next time get element 1 and 2 and put this in another variable.
}
我该如何做到这一点?
答案 0 :(得分:152)
你可以对数组的元素进行enhanced for loop(对于java 5及更高版本)进行迭代:
String[] elements = {"a", "a", "a", "a"};
for (String s: elements) {
//Do your stuff here
System.out.println(s);
}
答案 1 :(得分:34)
String[] elements = { "a", "a", "a", "a" };
for( int i = 0; i < elements.length - 1; i++)
{
String element = elements[i];
String nextElement = elements[i+1];
}
请注意,在这种情况下,elements.length
为4,因此您希望从[0,2]
进行迭代,以获取元素0,1
,1,2
和2,3
。< / p>
答案 2 :(得分:5)
String current = elements[i];
if (i != elements.length - 1) {
String next = elements[i+1];
}
这确保你没有为最后一个元素获得ArrayIndexOutOfBoundsException
(那里没有'next')。另一种选择是迭代到i < elements.length - 1
。这取决于您的要求。
答案 3 :(得分:3)
String[] elements = { "a", "a","a","a" };
for( int i=0; i<elements.length-1; i++)
{
String s1 = elements[i];
String s2 = elements[i+1];
}
答案 4 :(得分:2)
我认为而不是测试i
小于elements.length - 1
测试i + 1
小于elements.length
。您没有更改您正在查看的数组的域(即忽略最后一个元素),而是更改您在每次迭代中看到的最大元素。
String[] elements = { "a", "a","a","a" };
for(int i = 0; i + 1 < elements.length; i++) {
String first = elements[i];
String second = elements[i+1];
//do something with the two strings
}
答案 5 :(得分:1)
您必须维护序列访问阵列的次数。请使用
int lookUpTime=0;
for(int i=lookUpTime;i<lookUpTime+2 && i<elements.length();i++)
{
// do something with elements[i]
}
lookUpTime++;
答案 6 :(得分:0)
由于比较,这些算法都不正确:
for(int i = 0; i&lt; elements.length - 1; i ++)
或
for(int i = 0; i + 1&lt; elements.length; i ++){
确实,数组元素的范围从0
到length - 1
,但在这种情况下的比较应为less than or equal to
。
那应该是:
for(int i = 0; i&lt; elements.length; i ++){
或
for(int i = 0; i&lt; = elements.length - 1; i ++){
或
for(int i = 0; i + 1&lt; = elements.length; i ++){
数组["a", "b"]
会迭代为:
i = 0&lt; 2:元素[0]产生“a”
i = 1&lt; 2:元素[1]产生“b”
然后退出循环,因为2不是&lt; 2。
不正确的例子都提前退出循环,只在这个简单的两个元素的情况下用第一个元素执行。
答案 7 :(得分:0)
String[] nameArray= {"John", "Paul", "Ringo", "George"};
int numberOfItems = nameArray.length;
for (int i=0; i<numberOfItems; i++)
{
String name = nameArray[i];
System.out.println("Hello " + name);
}
答案 8 :(得分:0)
如果您正在寻找性能而迭代顺序不相关,则可以使用优化的反向循环进行迭代:
for(int i=elements.lenth; --i>=0;) {...}
通过这种方式,您只需一次检索数组的长度,然后递减索引并在一个原子操作中与零进行比较。最后但并非最后一次与零进行比较是一个非常快的操作,通常会被许多处理器选择(比与数组的整数进行比较要快)。
答案 9 :(得分:0)
只要这个问题仍然无法解决OP的问题并且Java多年来发展起来,我就决定自己编写一个。
为了清楚起见,我们将输入String数组更改为具有5个唯一项。
String[] elements = {"a", "b", "c", "d", "e"};
您要访问列表中的两个同级,每次迭代都增加一个索引。
for (int i=0; i<elements.length-1; i++) { // note the condition
String left = elements[i];
String right = elements[i+1];
System.out.println(left + " " + right); // prints 4 lines
}
在四个迭代中打印左右一对结果会导致控制台中的行a b
,b c
,c d
,d e
。
如果输入字符串数组的元素少于2个,会发生什么?只要此for循环始终提取两个同级节点,什么都不会打印。少于2个元素的程序本身不会进入循环。
就您的代码片段而言,假设您不希望舍弃提取的值,而是将它们添加到另一个变量中(假设在for循环范围之外),则希望将其存储在列表或数组中。假设您要用+
字符连接兄弟姐妹。
List<String> list = new ArrayList<>();
String[] array = new String[elements.length-1]; // note the defined size
for (int i=0; i<elements.length-1; i++) {
String left = elements[i];
String right = elements[i+1];
list.add(left + "+" + right); // adds to the list
array[i] = left + "+" + right; // adds to the array
}
同时打印列表和数组(Arrays.toString(array)
)的内容将导致:
[a+b, b+c, c+d, d+e]
从Java 8开始,您可能会想利用Stream API的优势,但是,它是为处理源集合中的各个元素而设计的。没有这样的方法可以一次处理2个或更多同级节点。
唯一的方法是使用Stream API代替处理索引并将它们映射到实际值。只要从名为IntStream
的原始Stream开始,就需要使用IntStream::mapToObj
方法来装箱Stream<T>
:
String[] array = IntStream.range(0, elements.length-1)
.mapToObj(i -> elements[i] + "+" + elements[i + 1])
.toArray(String[]::new); // [a+b, b+c, c+d, d+e]
List<String> list = IntStream.range(0, elements.length-1)
.mapToObj(i -> elements[i] + "+" + elements[i + 1])
.collect(Collectors.toList()); // [a+b, b+c, c+d, d+e]