sobadstan 2024-05-21 15:13 采纳率: 28.6%
浏览 4
已结题

java代码改成工具类后结果不一样

用new的方式传入数组获得其中不一样的数值时可以获得正确结果,改成工具类后答案不正确

package task3_1;

public  class CoinUtil {
    private int[] arr;
    public CoinUtil(int[] arr){
        this.arr=arr;
    }
    public int Find(int a, int b){
        //如果传入的下标相同,代表只剩一个数组
        if (a==b){
            return a;
        }
        //用结束下标减去开始下标加一获得传过来的数组长度
        int len= b-a+1;
        //把数组分成四份,计算前三份的长度
        int size=(len-len%3)/3;
        //根据前三份数组对应的下标求数组的和
        int sum1,sum2,sum3;

        sum1=sum(arr,a,a+size-1);

        sum2=sum(arr,a+size,a+2*size-1);

        sum3=sum(arr,a+2*size,a+3*size-1);
        //第一份数组的和以其他两份的大小都不一样,代表假币就在里面
        if (sum1!=sum2&&sum1!=sum3){
            return Find(a,a+size-1);
            //第二份数组的和以其他两份的大小都不一样,代表假币就在里面
        } else if (sum2!=sum1&&sum2!=sum3) {
            return Find(a+size,a+2*size-1);
            //第三份数组的和以其他两份的大小都不一样,代表假币就在里面
        } else if (sum3!=sum1&&sum3!=sum2) {
            return Find(a+2*size,a+3*size-1);
            //代表假币不在这三份数组里面而在没被划分进数组的那堆零散的部分里
        }else return Find(a+3*size,a+len-1);
    }
    //获取数组下标a,b之间的和(包含a,b)
    public static  int sum(int[] arr,int a,int b){
        int sum=0;
        for (int i = a; i <= b; i++) {
            sum=sum+arr[i];
        }
        return sum;
    }
}

new CoinUtil来调用Find 结果是5

package task3_1;

public class test {
    public static void main(String[] args) {
        int[] arr={1,1,1,1,1,2,1,1,1};
        CoinUtil cu=new CoinUtil(arr);
        int index=cu.Find(0,arr.length-1);
        System.out.println(index);
    }
}

改成工具类

package task3_1;

public final class CoinUtil {
    private CoinUtil(){}
    public int Find(int[] arr,int a, int b){
        //如果传入的下标相同,代表只剩一个数组
        if (a==b){
            return a;
        }
        //用结束下标减去开始下标加一获得传过来的数组长度
        int len= b-a+1;
        //把数组分成四份,计算前三份的长度
        int size=(len-len%3)/3;
        //根据前三份数组对应的下标求数组的和
        int sum1,sum2,sum3;

        sum1=sum(arr,a,a+size-1);

        sum2=sum(arr,a+size,a+2*size-1);

        sum3=sum(arr,a+2*size,a+3*size-1);
        //第一份数组的和以其他两份的大小都不一样,代表假币就在里面
        if (sum1!=sum2&&sum1!=sum3){
            return Find(arr,a,a+size-1);
            //第二份数组的和以其他两份的大小都不一样,代表假币就在里面
        } else if (sum2!=sum1&&sum2!=sum3) {
            return Find(arr,a+size,a+2*size-1);
            //第三份数组的和以其他两份的大小都不一样,代表假币就在里面
        } else if (sum3!=sum1&&sum3!=sum2) {
            return Find(arr,a+2*size,a+3*size-1);
            //代表假币不在这三份数组里面而在没被划分进数组的那堆零散的部分里
        }else return Find(arr,a+3*size,a+len-1);
    }
    //获取数组下标a,b之间的和(包含a,b)
    public static  int sum(int[] arr,int a,int b){
        int sum=0;
        for (int i = a; i <= b; i++) {
            sum=sum+arr[i];
        }
        return sum;
    }
}

调用工具类输入参数,结果是10

package task3_1;

public class test {
    public static void main(String[] args) {
        int[] arr={1,1,1,1,1,2,1,1,1};
        int index=CoinUtil.sum(arr,0,arr.length-1);
        System.out.println(index);
    }
}

我哪步错了嘞?

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-05-21 15:13
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】:您的问题是要解决在将Java代码从使用new实例化对象的方式改为工具类(静态方法)后,Find方法返回的结果不正确的问题。

    【问题出现原因】:问题出现的原因在于将Find方法改为静态方法后,静态方法不能直接访问非静态成员变量或调用非静态方法。在您的代码中,Find方法试图调用sum静态方法,但是没有正确地传递arr数组的引用。

    【问题解决方案】:要解决这个问题,您需要确保静态方法可以访问到传入的数组参数。此外,您的main方法中的调用也存在问题,因为它错误地调用了sum方法而不是Find方法。

    【提供代码】:以下是修改后的代码,它将Find方法改为静态,并正确地处理数组参数。

    package task3_1;
    
    public final class CoinUtil {
        // 私有构造函数,防止实例化
        private CoinUtil(){}
    
        // 静态Find方法,正确处理传入的数组参数
        public static int Find(int[] arr, int a, int b) {
            if (a == b) {
                return a;
            }
            int len = b - a + 1;
            int size = (len - len % 3) / 3;
            int sum1 = sum(arr, a, a + size - 1);
            int sum2 = sum(arr, a + size, a + 2 * size - 1);
            int sum3 = sum(arr, a + 2 * size, a + 3 * size - 1);
    
            if (sum1 != sum2 && sum1 != sum3) {
                return Find(arr, a, a + size - 1);
            } else if (sum2 != sum1 && sum2 != sum3) {
                return Find(arr, a + size, a + 2 * size - 1);
            } else if (sum3 != sum1 && sum3 != sum2) {
                return Find(arr, a + 2 * size, a + 3 * size - 1);
            } else {
                return Find(arr, a + 3 * size, a + len - 1);
            }
        }
    
        // 静态sum方法,用于计算数组子区间的和
        public static int sum(int[] arr, int a, int b) {
            int sum = 0;
            for (int i = a; i <= b; i++) {
                sum += arr[i];
            }
            return sum;
        }
    }
    

    【代码运行方式】:将上述代码保存为.java文件,并使用Java编译器编译和运行。确保您的环境已经安装了Java Development Kit (JDK)。

    【代码预期运行结果】:

    # 运行main方法后,预期输出应该是假币的索引
    # 例如,对于数组{1,1,1,1,1,2,1,1,1},预期输出是6(因为2是假币)
    

    请注意,索引是从0开始的,所以如果Find方法返回的是6,那么实际上假币位于数组的第7个位置。

    【推荐相关链接】:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月29日
  • 已采纳回答 5月21日
  • 创建了问题 5月21日