For-Each和Java中的指针

7 java foreach pointers arraylist

好的,所以我想要迭代一个ArrayList并删除一个specefic元素.但是,我在使用For-Each之类的结构时遇到了一些麻烦.当我运行以下代码时:

ArrayList<String> arr = new ArrayList<String>();
//... fill with some values (doesn't really matter)

for(String t : arr)
{
  t = " some other value "; //hoping this would change the actual array
}

for(String t : arr)
{
  System.out.println(t); //however, I still get the same array here
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何使't'成为'arr'的指针,以便我能够在for-each循环中更改值?我知道我可以使用不同的结构循环遍历ArrayList,但是这个看起来非常干净和可读,能够使't'成为指针会很好.

所有评论都表示赞赏!即使你说我应该吮吸它并使用不同的结构.

Mic*_*ick 16

我认为最好的方法可能是使用for循环.

    ArrayList<String> arr = new ArrayList<String>();

    for (int i = 0; i < arr.size(); i++) {

        String t = arr.get(i);

        if (// your condition is met) {
            arr.set(i, "your new value");
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果你在迭代时添加/删除数组中的项目,我认为你只会得到那个例外 (2认同)

Bal*_*usC 5

问题是您正在尝试更改循环范围的引用, t以使其指向新的String实例.这不会起作用.它没有引用arraylist中的实际条目.您需要更改引用的实际.如果String是可变的并且set()为此提供了一种虚拟方法,那么理论上可以这样做

for (String t : arr) {
    t.set("some other value");
}
Run Code Online (Sandbox Code Playgroud)

左右,但这是不可能的,因为它是不可变的.最好使用普通for循环来获取数组本身中入口点的句柄:

for (int i = 0; i < arr.size(); i++) {
    arr.set(i, "some other value");
}
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用增强型for循环,那么你需要替换StringStringBuilder,这是可变的:

for (StringBuilder t : arr) {
     t.delete(0, t.length()).append("some other value");
}
Run Code Online (Sandbox Code Playgroud)

请记住,Java是按值传递,而不是按引用传递.