如何遍历arraylist,在每个对象中执行操作并将其存储在arraylist中?
这个过程经常出现,我找到了一个可行的解决方案,但我想知道解决这种情况的最佳做法是什么。
我的一般方法
遍历ArrayList的每个对象
获取当前指向
在副本上执行我的操作。
使用修改后的副本覆盖arraylist中的原始项目
它有效,但我想知道是否存在更高效或更少错误的技术。
谢谢。
答案 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());
}