访问成员变量与创建新对象

时间:2017-10-18 20:20:05

标签: java object new-operator

所以我有一些代码返回一个名为min max的对象中数组的最小值和最大值。我的问题是在for循环中我们需要在每次迭代时创建一个新的MinMax对象。或者我们可以像这样更新MinMax的成员变量:

globalMinMax.largest = Math.min(globalMinMax.smallest, localMinMax.smallest);
globalMinMax.smallest = Math.max(globalMinMax.largest, localMinMax.largest));

而不是像我们在下面的代码中的星号行上那样创建新的MinMax

private static class MinMax {
   public Integer smallest;
   public Integer largest;

   public MinMax(Integer smallest, Integer largest) {
     this.smallest = smallest;
     this.largest = largest;
   }

   private static MinMax minMax(Integer a, Integer b) {
     return Integer.compare(b, a) < 0 ? new MinMax(b, a) : new MinMax(a, b);
   }
}

public static MinMax findMinMax(List<Integer> A) {
   if (A.size() <= 1) {
      return new MinMax(A.get(0), A.get(0));
   }

   MinMax globalMinMax = MinMax.minMax(A.get(0), A.get(1));
   // Process two elements at a time.
   for (int i = 2; i + 1 < A.size(); i += 2) {
   MinMax localMinMax = MinMax.minMax(A.get(i), A.get(i + 1));
   **********Do we need to create a new object here?*****
   globalMinMax
      = new MinMax(Math.min(globalMinMax.smallest, localMinMax.smallest),
                   Math.max(globalMinMax.largest, localMinMax.largest));
   }
   // If there is odd number of elements in the array, we still
   // need to compare the last element with the existing answer.
   if ((A.size() % 2) != 0) {
      globalMinMax
       = new MinMax(Math.min(globalMinMax.smallest, A.get(A.size() - 1)),
                   Math.max(globalMinMax.largest, A.get(A.size() - 1)));
   }
   return globalMinMax;
}

2 个答案:

答案 0 :(得分:1)

这段代码太复杂了。您应该使用已生成的MinMax类作为列表的最小值/最大值的存储,但不应在计算期间使用它。

查找列表的最小值/最大值非常简单:

int minimum = A.get(0);
int maximum = A.get(0);
for(int i=1; i < A.size(); i++){
   if(A.get(i) < minimum) minimum = A.get(i);
   if(A.get(i) > maximum) maximum = A.get(i);
}
return new MinMax(minimum, maximum);

如果要将MinMax类更多地合并到整个程序中,可以向名为generateMinMaxFromList的类添加静态方法,该方法将从提供的整数列表中静态生成minMax对象。

答案 1 :(得分:0)

如果在多线程环境中未访问数据,则更新globalMinMax将是所提供的两者的更好解决方案。你也不需要旋转很多对象(特别是在循环中)只是为了找到最小值和最大值。当您迭代的源集合包含大量元素时,这会导致开销。

但是,有一种情况是您希望在每次迭代中创建MinMax个对象的新实例。这将是您启动多个线程来处理数据。

注意 - 如果传入的列表为空,则MinMax方法中的第一次检查会引发异常。因此,检查A.size() == 0作为方法中的第一个语句并执行适当的操作。

相关问题