基于多个变量的值更新变量的有效解决方案

时间:2014-12-06 20:52:43

标签: java design-patterns callback

我有一个更新方法,每次屏幕刷新时都会调用它。

在这个方法中,我检查大约50个对象的值为零。如果所有值都为零,则返回true,否则返回false。

这就是我实施的方式,并想知道是否有更好的方法来实现它。

public boolean update()
{
    float totalVel = 0;
    for(int i=0; i< this.numOfObjects; i++)
    {
         totalVel += BagOfWordsAverage[i];
    }

    if(totalVel == 0)
          return true;
    return false;

}

根据返回的布尔值,udpate函数的调用者允许来自用户的某些输入。因此,如果返回False,则用户无法点击屏幕,但在真实的情况下,用户可以做任何她想做的事情。

BagOfWordsAverage是一个float数组。我只需添加整个数组的值,并检查总数是否为0.数组中的任何项都不能为负值。

有没有更好的方法来实现我想要实现的目标?挑战在于,如果对象数量增加到5000,我的方法会扩展吗?由于这是一个App,速度非常重要。

4 个答案:

答案 0 :(得分:2)

  

如果所有值都为零,则返回true,否则返回false。

因此,只要您看到非零值,就可以立即返回false。 如果你走出循环, 这必须意味着一切都为零,你可以返回true

public boolean update()
{
    for(int i=0; i< this.numOfObjects; i++)
    {
         if (BagOfWordsAverage[i] > 0) return false;
    }
    return true;
}

更好的方法是在Java中迭代数组:

public boolean update()
{
    for (float value : BagOfWordsAverage)
    {
         if (value > 0) return false;
    }
    return true;
}

此外,Java中的命名约定是变量名camelCase, 所以我建议将BagOfWordsAverage重命名为bagOfWordsAverage

答案 1 :(得分:1)

有效的解决方案根本不是循环。您可以为每个索引创建一个值大于零的映射。如果地图的大小为0,那么您就知道数组的总数为零。

你没有发布你的代码结构,但是这样的东西可能会给你一个想法:

Map<Integer, Boolean> moreThanZero = new HashMap<>();

public void someActionOnArray(int index) {
    /*
    do some action
     */

    float value = bagOfWordsAverage[index];

    if (value > 0) {
        moreThanZero.put(index, true);
    }

    if (value == 0) {
        if (moreThanZero.containsKey(index)) {
            moreThanZero.remove(index);
        }
    }
}

public boolean update() {
    return (moreThanZero.size() == 0);
}

修改数组的每个方法都应检查当前索引处的修改值。如果它大于零,则在地图上标记索引。如果它小于零,则删除它(如果存在)。

如果值大于零的索引的大小很大,这可能会花费你一些内存,但是你将获得速度,因为你不必每次刷新时都循环。

答案 2 :(得分:0)

您可以稍微提高方法速度的一种方法是检查每个值并查看它是否为零,如果不是,则立即返回false。如果你通过循环而没有找到除零之外的任何值,则可以返回true。

public boolean update()
{
    for(int i=0; i< this.numOfObjects; i++)
    {
         if (BagOfWordsAverage[i] != 0)
         {
             return false;
         }
    }
    return true;
}

请注意,虽然您的函数的实际平均大小写运行时间会随着此更改而改善(例如,如果数组中间存在非零值,则运行时将为O(n / 2)而不是O (n)),big-O分析通常省略除最高阶函数之外的所有函数,并将O(3n),O(n / 2)之类的东西简化为O(n),因为它们是在线性运行的时间。

至于关于5000个项目的数组的问题,平均情况需要原始函数的一半时间,但在最坏的情况下,速度将是相同的。如果我们无法假设这些非零数字的可能位置在哪里,那么除了单独检查数组的每个索引之外别无选择。

希望这有帮助。

答案 3 :(得分:-1)

一旦获得非零值,您想要返回false吗?做类似的事情:

for(int i = 0; i < foo.length; i++) {
    if (foo[i] > 0) {
        return false;
    }
}
return true;