访问成员变量vs创建新对象
问题描述:
所以我有一些代码返回一个数组中的最小值和最大值,称为min max。我的问题是在for循环中,我们需要在每次迭代中创建一个新的MinMax对象。或者可能我们刚刚更新,像这样MINMAX的成员变量:访问成员变量vs创建新对象
globalMinMax.largest = Math.min(globalMinMax.smallest, localMinMax.smallest);
globalMinMax.smallest = Math.max(globalMinMax.largest, localMinMax.largest));
不是每次都创建一个新的极小极大像我们做带星行下面的代码中
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;
}
答
此代码是太复杂它在做什么。您应该使用您生成的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
,它将从提供的Integer列表中静态生成minMax对象。
答
如果未在多线程环境中访问数据,更新globalMinMax
将是更好的解决方案。你也不需要旋转很多物体(特别是在一个循环内)只是为了找到最小值和最大值。当你迭代的源代码集合有很多元素时,这可能会导致开销。
但是,有一种情况需要在每次迭代中创建一个新的MinMax
对象实例。这将是当你启动多个线程来处理数据时。
注 - 在MinMax
方法中的第一检查将抛出一个异常,如果传入的列表为空。从而检查A.size() == 0
作为方法中的第一条语句并执行相应的操作。
为什么'Integer.compare(b,a) shmosel
你认为可能有问题吗?你为什么这么认为?你测试了你的想法吗?你为什么需要我们的输入? – shmosel
我想知道是否有利用新的关键字,而不是直接访问对象。我想知道为什么作者作出这个决定,是否重要 – Matt