遍历Java中的字符串数组

Posted

技术标签:

【中文标题】遍历Java中的字符串数组【英文标题】:Iterate through string array in Java 【发布时间】:2011-10-06 04:00:52 【问题描述】:

我有一些包含一些组件的字符串数组,这个数组有 5 个组件,并且它有时会发生变化。我想做的是遍历该数组并获取第一个组件和该组件旁边的组件。所以第一次我会得到第一个组件和第 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. 

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用enhanced for loop(适用于 java 5 及更高版本)对数组元素进行迭代:

String[] elements = "a", "a", "a", "a";   
for (String s: elements)            
    //Do your stuff here
    System.out.println(s); 

【讨论】:

如何获得其中的迭代次数?还是我需要通过声明一个变量并计算迭代次数来手动完成? 我认为您需要添加其他变量来存储此信息 另请注意,此高级 for 循环适用于 Java 1.5 及更高版本。我知道 1.4 及以下版本是古老的,但大多数人尝试这个并得到错误,在某些情况下他们不会检查他们使用的 java 版本。 我可能遗漏了一些东西,但我不明白当它没有回答问题时,这个答案是如何获得这么多赞成票的......(除非你只阅读主题)。 这种迭代格式是否可以获取键索引?【参考方案2】:
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

【讨论】:

【参考方案3】:
String current = elements[i];
if (i != elements.length - 1) 
   String next = elements[i+1];

这确保您不会为最后一个元素获得ArrayIndexOutOfBoundsException(那里没有“下一个”)。另一种选择是迭代到i &lt; elements.length - 1。这取决于您的要求。

【讨论】:

【参考方案4】:
String[] elements =  "a", "a","a","a" ;

for( int i=0; i<elements.length-1; i++)

    String s1 = elements[i];
    String s2 = elements[i+1];

【讨论】:

【参考方案5】:

我会争论而不是测试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

【讨论】:

【参考方案6】:

你必须维护序列你访问数组的次数。像这样使用

int lookUpTime=0;

    for(int i=lookUpTime;i<lookUpTime+2 && i<elements.length();i++)
     
    // do something with elements[i]
    

lookUpTime++;

【讨论】:

【参考方案7】:
    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】:

由于比较,这些算法都不正确:

for(int i = 0; i

for(int i = 0; i + 1

确实,数组元素的范围从0length - 1,但这种情况下的比较应该是less than or equal to。 应该是:

for(int i = 0; i

for(int i = 0; i

for(int i = 0; i + 1

数组["a", "b"] 将迭代为:

i = 0 is

i = 1 is

然后退出循环,因为 2 不是

在这个简单的两个元素的例子中,错误的例子都会提前退出循环,并且只使用第一个元素执行。

【讨论】:

【参考方案9】:

只要这个问题仍未得到解答,OP 的问题和 Java 多年来一直在发展,我就决定提出自己的问题。

为了清楚起见,让我们将输入字符串数组更改为具有 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 个元素的程序不会进入循环本身。

只要您的 sn-p 说您不想丢弃提取的值,而是将它们添加到另一个变量,假设在 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 的原始流开始,你就需要使用IntStream::mapToObj 方法来装箱Stream&lt;T&gt;

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]

【讨论】:

【参考方案10】:

如果您正在寻找性能并且迭代顺序不相关,您可以使用优化的反向循环进行迭代:

int elemLength = elements.length;
if(elemLength < 2)
  // avoid ArrayIndexOutOfBoundsException ...
 else 
  String elem1, elem2;
  for(int i = elemLength -1; --i >= 0;) 
    elem1 = elements[i];
    elem2 = elements[i+1];
    // do whatever you want with those two strings
  

通过这种方式,您只需检索一次数组的长度,然后在一次操作中递减索引并与零进行比较。与零比较是一种非常快速的操作,通常由许多架构优化(比与数组长度比较更容易/更快)。

【讨论】:

以上是关于遍历Java中的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

handlebars 遍历数组判断是不是含有字符

java怎样用foreach遍历字符串数组?

求jsp json数组遍历方法

php foreach输出数组只输出元素的第一个字符

Java 如何遍历数组里面的数据?

Java数组去重复问题