【问题标题】:Most efficient way to search list of objects and also increment variable of this object in java在java中搜索对象列表并增加该对象变量的最有效方法
【发布时间】:2012-03-11 15:04:45
【问题描述】:

搜索对象列表并增加其中一个变量的最有效方法是什么?此外 addData() 函数调用 10000 次,在此列表中最多有 30 个带有增量变量的 diff-diff 键。

谢谢,

public void addData(List<DataWise> wise ,String name) 
    {
        if(wise!=null)
        {

            for (DataWise dataWise : wise) {

                if(dataWise.getName().equals(name))
                {
                    dataWise.setVisits(1);
                    return;
                }
            }
        }
        DataWise dataWise2=new DataWise(name,1);
        wise.add(dataWise2);
    }

public class DataWise 
{

    private String name;
    private int visits;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getVisits() {
        return visits;
    }
    public void setVisits(int visits) {
        this.visits+= visits;
    }
}

【问题讨论】:

  • 目前,代码不起作用。如果 'wise' 为 null,您将在 addData() 的最后一行得到一个空指针异常。根据允许更改接口的程度,最好使用 HashMap 进行查找。

标签: java performance optimization memory-management data-structures


【解决方案1】:

如果保证每个 DataWise 的名称在列表中是唯一的,请使用 HashMap&lt;String, DataWise&gt;,其中 String 键是 DataWise 的名称。这将导致 O(1) 而不是 O(n):

Map<String, DataWise> map = new HashMap<String, DataWise>();
...
DataWise wise = map.get(name);
if (wise != null) {
    wise.incrementVisits();
}
else {
    wise = new DataWise(name, 1);
    map.put(name, wise);
}

请注意,setter (setVisits()) 应该将访问值设置为参数的值。增加访问次数确实违反直觉。这就是我使用incrementVisits方法的原因,这样更清晰。

【讨论】:

  • 但是,我只有 List of Arraylist 而不是 Map ,那我该怎么办?请帮助我 - 谢谢,
  • 然后按照您在问题中所做的操作。没有比遍历列表并找到要修改的元素更快的方法了。
猜你喜欢
  • 2018-10-21
  • 2017-03-17
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2014-12-04
相关资源
最近更新 更多