早上好朋友,我有疑问/问题
我目前有以下代码:
ArrayList<BeanRelConsumoProducao> dataBeanList = new ArrayList<BeanRelConsumoProducao>();
.... // add to dataBeanList
for (int i=0; i<dataBeanList.size(); i++)
{
BeanRelConsumoProducao bean = dataBeanList.get(i);
String nomeprod = bean.getProdNome();
if(nomeprod.equals(bomLine.getM_Product().getName()))
{
bean.setProdConsumo(bean.getProdConsumo().add(consumo.multiply(bomLine.getQtyBOM())));
taNaLista = true; // item found
}
}
但是这个循环在另一个循环中,而dataBeanList有很多对象,使得查询非常慢。
如何提高性能以更快地找到对象并使代码变慢?
此代码用于比较产品列表材料项目。 (BOM)
谢谢。
答案 0 :(得分:0)
假设bean名称是唯一的,您可以使用某种Map
:
ArrayList<BeanRelConsumoProducao> dataBeanList = new ArrayList<BeanRelConsumoProducao>();
.... // add to dataBeanList
//Create a map of names to beans (Java 8):
LinkedHashMap<String,BeanRelConsumoProducao> beansByName = dataBeanList.stream().collect(Collectors.mapping(BeanRelConsumoProducao::getProdNome, bean->bean);
//directly grab the desired bean:
BeanRelConsumoProducao prod = beansByName.get(bomLine.getM_Product().getName());
if(prod!=null) {
//was found
taNaLista = true;
} else {
//not found.
}
其他说明:
beansByName
(如果没有必要,请不要为每个物料清单项目重新计算)。LinkedHashMap
,因为它保留了原始排序。如果您不关心订购,只需使用HashMap
如果你不能使用Map
,根据评论,你至少应该在找到你的项目后立即切换循环。您可以在break;
taNaLista = true;
来完成此操作
修改强>
HashMap<String, BeanRelConsumoProducao> dataBeanList = new HashMap(); BeanRelConsumoProducao beanHash = dataBeanList.get(bomLine.getM_Product().getName()); if(beanHash != null) { taNaLista = true; }
但是,我遇到了一个问题:
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataBeanList);
大概JRBeanCollectionDataSource
的构造函数需要List
。由于我们的“列表”已更改为Map
,因此它们不再是类型兼容的。如果您有权访问JRBeanCollectionDataSource
的源代码,则可以执行以下操作:
Collection
类型的参数。将上述内容更改为:
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataBeanList.values());
另一方面,如果您无法更改JRBeanCollectionDataSource
,则需要将地图中的值转换回列表,例如:
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(new ArrayList(dataBeanList.values()));
答案 1 :(得分:0)
我根据一些建议从ArrayList改为HashMap并制定出来。
但我需要将数据发送到iReport报告,我现在无法转换HashMap数据......有什么建议吗?
HashMap<String, BeanRelConsumoProducao> dataBeanList = new HashMap();
BeanRelConsumoProducao beanHash = dataBeanList.get(bomLine.getM_Product().getName());
if(beanHash != null) {
taNaLista = true;
}
但是,我遇到了一个问题:
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataBeanList);