在Java中迭代字符串数组

时间:2011-07-15 13:27:08

标签: java arrays collections

我有一些包含一些组件的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. 
}

我该如何做到这一点?

10 个答案:

答案 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,11,22,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 ++){

确实,数组元素的范围从0length - 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 bb cc dd 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

从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]