我正在编写一些代码来执行网格映射的DFS。我调用的一个函数是getNeighbors(...),它获取指定单元格的所有邻居:
public ArrayList<Point> getNeighbors(int i, int j) {
ArrayList<Point> result = new ArrayList<>();
for (Point n : upDownLeftRightDirections) {
int dx = i + n.x;
int dy = j + n.y;
result.add(new Point(dx, dy));
}
return result;
}
... Later in the code ...
for (Point neighbor : getNeighbors(i, j)) {
... Do stuff ...
}
我的问题是,每次处理一个单元格时,我觉得这个过程似乎很浪费,特别是因为邻居列表只使用了一次。有关如何重写以避免每次创建新列表的任何建议 - 主要是为了利用每次调用我只需要迭代邻居一次的事实?
答案 0 :(得分:1)
有关如何重写以避免每次都创建新列表的任何建议
您可以将import { Component } from '@angular/core';
@Component({
selector: 'my-app',
//templateUrl: './app/app.component.html',
template:`
<div class="flex-container" fxFlex=100>
<div class="colored box" >
<div fxFlex.lg=100 fxFlex.md=50> flexible for screensize </div>
<div fxFlex.lg=100> fxFlex </div>
<div fxFlex=33> fxFlex </div>
</div>
</div>
<div class="version">@angular/flex-layout (v2.0.0-beta.0)</div>
`,
styleUrls: ['./app/app.component.css']
})
export class AppComponent {
}
列表声明为实例变量。这样,您可以在每次完成对邻居的迭代时清除它:
result
主要是为了利用我只需要迭代的事实 邻居每次通话一次?
您应该对代码进行基准测试,看看这是否真的比以前的方法具有性能优势。
答案 1 :(得分:0)
功能方法也适用于此;我不熟悉Java的深层语义,但有点像:
public void consumeNeighbors(Function f) {
for (Point n : upDownLeftRightDirections) {
int dx = i + n.x;
int dy = j + n.y;
f(dx, dy);
}
}
这将避免在迭代邻居时创建新的Point对象和新的List。但同样,目前尚不清楚这会带来显着的节省,因此需要通过基准测试来确定以这种方式重构是否值得。