所以我有一些代码,在一个名为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;
}
发布于 2017-10-18 20:30:08
这段代码对于它所做的事情来说太复杂了。您应该使用生成的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对象。
发布于 2017-10-18 20:32:15
如果数据不是在多线程环境中访问的,那么更新globalMinMax
将是两种解决方案中更好的一种。您也不需要旋转许多对象(特别是在循环中)来查找最小值和最大值。当您正在迭代的源集合包含大量元素时,这可能会导致开销。
但是,有一种情况是您希望在每次迭代中创建MinMax
对象的新实例。这是当你启动多个线程来处理数据的时候。
注意--如果传入的列表为空,MinMax
方法中的第一次检查将抛出异常。因此,检查A.size() == 0
是否为该方法中的第一个语句,并执行适当的操作。
https://stackoverflow.com/questions/46818583
复制相似问题