这个问题已经有一个答案在这里:

好了,我很疲倦迭代过对列表,并删除specefic元。然而,我有一些麻烦使用为每个类的结构。当我运行下列代码:

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
}

我的问题,如何才能使"t"指'arr'这样,我能够改变价值观在为每个循环?我知道我可以循环。使用不同结构,但这个看起来很干净和可读的,它也只可能使"t"指针。

所有的评论表示赞赏!甚至如果你说我应该吸它,并使用不同的结构。

有帮助吗?

解决方案

我认为最好的办法可能是使用对环。

    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");
        }
    }

其他提示

问题是,你在试图改变环范围 参考 t 让它指向一个新的串的实例。这不是去工作。它不是指实际进入在对列表.你需要改变实际 的参考。如果 String 是可变的,并提供了一个虚构的 set() 方法,你可以在理论上做

for (String t : arr) {
    t.set("some other value");
}

或是这样,但这是不可能的,因为它是不可改变的。更好地得到处理的入口点在数组本身使用正常的 for 循环:

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

如果你坚持要求在利用增强的 for 循环,然后你需要替换 String 通过 StringBuilder, ,这是可变的:

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

记住,Java是通过价值,而不是通过参照。

-每个都没给你一个指标的指针,所以你就不能用它来改变一个不可改变的价值。

无论是使用对环的索引,或者使用一个可变的类型(如StringBuffer,不String)

一系列的对象(如串)在Java是一个毗连区块包含一系列有序的参考。所以,当你有一系列的4个字符串有什么你真是4引用的储存中的阵列的,而4串的对象之外的阵列,但是所引用的其4个元素。

什么为每一个构造中Java不是创建一个地方的变量,对于每次迭代,复制到这地方变量的参考从阵的单元格对应于这一迭代。当你设置循环变量(t = " some other value")你把一个参考到一个新的串, "some other value", ,进入地方的可变t,不进入阵列。

这与一些其他语言(样Perl)其中的循环变行为等别名数组/单元本身。

你的代码被重新写的编译器作为这样的事情:

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

for (final Iterator <String> i = arr.iterator(); i.hasNext();) {
    String t;

    t = i.next();
    t = " some other value "; // just changes where t is pointing
}

做你想要什么你会写的循环是这样的:

for (final ListIterator<String> i = arr.iterator(); i.hasNext();) {
     final String t;

     t = i.next();
     i.set("some other value");
}

迭代不具有设定方法中,只有ListIterator。

基本上你想要删除的字符串t从列表服务。只是做一个区。删除(t)和您可以做到的。 你不能这样做,同时循环同样的列表。你会得到一个异常,如果你尝试修改的列表用这种方式。

你有两个选择:

  1. 克隆列表中,迭代过克隆和中删除的特定'String从原来的名单
  2. 创建一个列表中删除候选人,加入所有具体'串名单,之后的迭代通过的原有清单,迭代过wastebin和消除一切你已经收集在这里从原来的名单。

选择1是最容易的,克隆可以制成如:

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

你似乎误解了如何对象/参考文献工作,这是非常基本使用的语言有效进行。然而,该代码应该做的你想要什么(歉意缺乏解释):

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

for(int i = 0; i < arr.size(); i++)
{
  arr.set(i, " some other value "); // change the contents of the array
}

for(String t : arr)
{
  System.out.println(t); 
}

我相信,这是不相关的或不可改变的可变的。

 t = " some other value "; //hoping this would change the actual array

t不持有的参照实际的对象。Java份价值从对列表,并将这一价值到t所阵列表的价值不会影响。

禾田

这已经回答。仍然在这里是我的建议。Var t内环路是唯一可见的存在。它不会被看到之外的循环。你可以做的 t.set() 如果这不是 String.

使用 StringBuffer 而不是普通的字符串。这样的串内是可变的。

串不可改变的。如果你有一个可变的种类型喜欢StringBuilder/缓冲区,可以改变串在你的迭代。你有参考文献,记得。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top