0

我刚开始使用增强 for 循环。我想知道我是否可以使用这个循环来复制一个数组。我想遍历某个数组的每个元素并将其复制到一个新元素。使用增强的 for 循环来实例化我的新数组(而不是典型的 for 循环)也会很好。在我当前的实现中,我确实知道我希望数组有多大,但为了将来的参考,我想知道我是否可以做到这一点,如果可以,如何做到。

我正在做的具体计划可能有助于回答我的问题。我正在做的是从文本文件中检索一行文本,然后在该字符串上调用 split(",") - 这将返回一个字符串数组。我想将此数组存储在内存中,以便以后可以使用它。

我理解增强型 for 循环的工作方式是,第一个值被分配到数组中的当前位置,第二个值是要遍历的数组。

我想知道for循环是否还有其他格式,除了:for(初始化;终止;迭代)和for(Object o:list[])。

4

3 回答 3

3

如果您想保留用于复制数组的增强型 for 循环,则存在一个主要问题:增强型 for 循环没有计数器。然而,将元素插入数组需要一个计数器。因此,您当然可以像这样手动执行此操作:

String[] array = {"A", "Bb", "c", "dD"};
String[] newArray = new String[array.length];

int i=0;
for(String stuff : array) {
    newArray[i++] = stuff;
}

这是完全可能的,但并不是增强 for 循环背后的真正想法。

更符合意图的是这样的:

String[] array = {"A", "Bb", "c", "dD"};
List<String> list = new ArrayList<String>();

for(String stuff : array) {
    list.add(stuff);
}

String[] newArray = new String[list.size()];
list.toArray(newArray);

这样,您不仅遵循增强的 for 循环背后的想法,而且还允许出现这种可能性array.length() != newArray.length()(例如,您过滤了数组)。

编辑:从 Java 7 开始,确实只有你提到的两个 for 循环。这可能会在未来的版本中发生变化,但如果看起来合理的话;毕竟,增强的 for 循环只是在 Java 5 中添加的(可以在这里看到)。

于 2013-06-19T09:03:04.320 回答
2

据我所知,只有标准for(init; termination; iterataion)循​​环和 for-eachfor(type o : iterable)循环。

首先,提前知道大小不应该是一个问题。要实例化新数组,请使用原始数组的 .length 字段:new String[original.length];如下所示。

继续前进,对于您正在做的事情,标准 for 循环是合适的,原因有两个:

  1. 您需要嵌套两个 for-each 循环才能迭代这两个循环,这比标准 for 循环更麻烦。(或添加一个外部定义的计数器,如 blalasaadri 的解决方案)
  2. 更重要的是,在原始数据类型或字符串的情况下,:在 for-each 循环中声明的变量表示每个连续元素的,而不是对实际元素的引用。因此,一旦循环迭代,对变量的任何更改都会消失。我不确定这是否适用于“普通”对象(即:不是字符串),因为我没有尝试过,但我现在想知道。

    为了显示:

    String[] sArr = {"foobar"};
    for(String s : sArr){
        s = "openbar";
    }
    

    相当于:

    String[] sArr = {"foobar"};
    String s = sArr[0];
    s = "openbar";
    

    可悲的是,对于 sArr[0],没有 open bar,同样是旧的 foobar。

至于解决方案,如果您可以import java.util.Arrays;尝试:

String[] copyStrings = Arrays.copyOf(arrStrings, arrStrings.length);

或者,如果您需要自己推出:

public String[] copyArray(String[] original){
    String[] dupe = new String[original.length]; //I assume you want equal length
    for(int i = 0; i < original.length; i++){
        dupe[i] = original[i]; //single iterator traverses both arrays
    }
    return dupe;
}
于 2013-06-19T06:15:12.677 回答
0
// copy contents of Object[] arr1 into Object[] arr2
arr2 = new int[arr1.length];
int i=0;
for(Object c:arr1){ //store an element of arr1 in c iteratively
    arr2[i] = c;
    i++;
}
于 2016-08-15T05:53:22.523 回答