Sha*_*vil 5 java mapping loops design-patterns list
我正在寻找一种有效的设计模式,将一个对象列表映射到另一个对象列表,并且它们之间具有零或一对一的关系。我意识到这种事情通常是在关系数据库中完成的,但在这种特殊情况下,它确实需要在 Java 应用程序中完成......
假设第一个列表包含Foo对象(即List<Foo>):
public class Foo {
public Integer id;
public String barName;
}
Run Code Online (Sandbox Code Playgroud)
第二个列表包含Bar对象(即List<Bar>):
public class Bar {
public Integer fooId;
public String name;
}
Run Code Online (Sandbox Code Playgroud)
如何最有效地将所有name属性映射Bar到equals 的Foo对象?Bar.fooIdFoo.id
我能想到的最好的是:
void mapFooBar(List<Foo> fooList, List<Bar> barList) {
for (Bar bar : barList) {
for (Foo foo : fooList) {
if (bar.fooId.equals(foo.id)) foo.barName = bar.name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据几个答案,我改进了我的代码,如下所示:
void mapFooBar(List<Foo> fooList, List<Bar> barList) {
Map<Integer, String> barMap = new HashMap<Integer, String>();
for (Bar bar : barList)
barMap.put(bar.fooId, bar.name);
for (Foo foo : fooList)
if (barMap.containsKey(foo.id)) foo.barName = barMap.get(foo.id);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
这很复杂,N * M意味着如果你有 5 个 foo 和 8 个 bar,则必须执行循环 40 次
class Container{
List<Foo> foos;
List<Bar> bars;
}
Run Code Online (Sandbox Code Playgroud)
如果你使用Map<Integer, Container>它将是N + M (5 + 8 = 13 次)
遍历两个列表一次并将其映射为id
另请参阅