如何遍历arraylist,在每个对象中执行操作并将其存储在arraylist中?

时间:2014-04-26 15:59:49

标签: java loops arraylist

如何遍历arraylist,在每个对象中执行操作并将其存储在arraylist中?

这个过程经常出现,我找到了一个可行的解决方案,但我想知道解决这种情况的最佳做法是什么。

我的一般方法

  • 遍历ArrayList的每个对象

  • 获取当前指向

  • 的对象的副本
  • 在副本上执行我的操作。

  • 使用修改后的副本覆盖arraylist中的原始项目

它有效,但我想知道是否存在更高效或更少错误的技术。

谢谢。

3 个答案:

答案 0 :(得分:1)

通常,您不需要这样做。

  • 获取当前指向

  • 的对象的副本
  • 在副本上执行我的操作。

  • 使用修改后的副本覆盖arraylist中的原始项目

您只需要获取原始对象并进行修改即可。然后你 不需要将它存储回数组列表,它已经存在。

答案 1 :(得分:0)

最好的方法是遍历arraylist,从列表中访问每个对象以及访问该对象的perofrm操作而不复制到新对象,然后自动修改的对象在列表中更新。

因为当我们从列表中获取元素时,我们实际上获得了引用变量,因此如果我们使用它进行修改,它将在对象所在的相同内存位置进行修改。

对于示例,您可以看到我在您的方案中执行的代码

List<Fan> fans  = new ArrayList<Fan>();
        Fan f1 = new Fan();
        Fan f2 = new Fan();
        fans.add(f1);
        fans.add(f2);
        for (Fan fan : fans) {
            performOperation(fan);
        }

        for (Fan fan : fans) {
            System.out.println(fan.getName());
        }
    }

    private static void performOperation(Fan fan) {
        fan.setName("hai");

    }

对每个Fan对象执行操作并自动反映并在修改后的第二个for循环中显示

让我知道任何问题。

答案 2 :(得分:0)

ArrayList中的对象是列表本身的独立对象。

如果对列表中的对象执行操作,它仍然在列表中的相同位置。你不需要“覆盖”它。

class Name {
    String n;
    Name(String n) {this.n = n;}
    String getName() {return n;}
    void setName(String n) {this.n = n;}
}
...
List<Name> names = new ArrayList<>();
names.add(new Name("Steve!"));
...
// shout louder
for (final Name name : names) {
    name.setName(name.getName().toUpperCase());
}

但是,如果对象是不可变的(您无法更改对象本身的内容),则无法修改列表中对象内的内容。您需要使用新对象覆盖列表中的条目。在这种情况下,您需要跟踪列表中的位置:

class Name {
    final String n;
    Name(String n) {this.n = n;}
    String getName() {return n;}
}
...
List<Name> names = new ArrayList<>();
names.add(new Name("Steve!"));
...
// shout louder
for (int i = 0; i < names.size(); i++) {
    final Name name = names.get(i);
    names.put(i, new Name(name.getName().toUpperCase());
}