有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

重构如何重构这个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) 个答案

  1. # 1 楼答案

    这个怎么样

    条件运算符?和:类似,(这些被称为三元运算符,在编译时解析为if-else块)

    if(condition) {
    this();
    } else { 
    that();
    }
    

    在上面的例子中,你可以把它单列为(条件?this():that())

    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++;
        }
        // let i = 0 to be factor2, i = 1 is factor 1
        for(int i = 0; i < 2; i++) { 
        for(int x = (i == 0 ? 1 : factor1.size() - 1); (i == 0 ? x < factor2.size() : x >= 0); (i == 0 ? x++ : x )){
            int blockSize = (i == 0 ? factor2.get(x) : factor1.get(x));
            int elementSize = (i == 0 ? factor1.get(x) : factor2.get(x));
            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;
        }
    }