所以我有一些代码返回一个名为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;
}
答案 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
作为方法中的第一个语句并执行适当的操作。