重构如何重构这个java代码
我有下面的java方法叫做solution
,有两个大的for循环,正如你所看到的,这两个for循环非常相似,所以我认为有一个像public int getElementSize(ArrayList<Integer> factor1, ArrayList<Integer> factor2)
这样的方法可以重构代码,它完成for循环的工作,所以我可以用不同的参数调用该方法两次,而不是重复这两个for循环。但是由于这两个for循环有不同的循环顺序,一个从头到尾,另一个从头到尾,除此之外,循环的所有其他部分都是相同的,有没有办法重构这段代码
class Solution {
public int solution(int[] A) {
ArrayList<Integer> factor1 = new ArrayList<Integer>();
ArrayList<Integer> factor2 = new ArrayList<Integer>();
int factor = 1;
int N = A.length;
while(factor * factor <= N){
if(N % factor == 0){
factor1.add(factor);
factor2.add(N / factor);
}
factor++;
}
for(int i = 1; i < factor2.size(); i++){
int blockSize = factor2.get(i);
int elementSize = factor1.get(i);
int peaks = 0;
for(int j = 0; j < blockSize; j++){
boolean hasPeak = false;
for(int k = elementSize * j; k < elementSize * (j + 1); k++){
if(k > 0 && k < N - 1){
if(A[k] > A[k - 1] && A[k] > A[k + 1])
hasPeak = true;
}
}
if(!hasPeak)
break;
else
peaks++;
}
if(peaks == blockSize)
return blockSize;
}
for(int i = factor1.size() - 1; i >= 0; i--){
int blockSize = factor1.get(i);
int elementSize = factor2.get(i);
int peaks = 0;
for(int j = 0; j < blockSize; j++){
boolean hasPeak = false;
for(int k = elementSize * j; k < elementSize * (j + 1); k++){
if(k > 0 && k < N - 1){
if(A[k] > A[k - 1] && A[k] > A[k + 1])
hasPeak = true;
}
}
if(!hasPeak)
break;
else
peaks++;
}
if(peaks == blockSize)
return blockSize;
}
return 0;
}
}
# 1 楼答案
这个怎么样
条件运算符?和:类似,(这些被称为三元运算符,在编译时解析为if-else块)
在上面的例子中,你可以把它单列为(条件?this():that())