在没有循环

时间:2018-04-06 13:03:45

标签: java object arraylist

早上好朋友,我有疑问/问题

我目前有以下代码:

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)

谢谢。

2 个答案:

答案 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(如果没有必要,请不要为每个物料清单项目重新计算)。
  • 如果对dataBeanList进行任何进一步更改,则需要使此映射保持最新状态。
  • 我使用了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的源代码,则可以执行以下操作:

  1. 更改其构造函数以接受Collection类型的参数。
  2. 将上述内容更改为:

    JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataBeanList.values());
    
  3. 另一方面,如果您无法更改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);