Java对数器的使用

参考:https://blog.csdn.net/itcats_cn/article/details/81389063

0、有一个你想要测的方法A

1、实现一个绝对正确但是复杂度不好的方法B

2、实现一个随机样本产生器 

3、实现比对的方法

4、把方法a和方法b比对很多次来验证方法a是否正确 

5、如果有一个样本使得比对出错,打印样本分析是哪个方法出错

6、当样本数量很多时比对测试依然正确,可以确定方法a已经正确。

我这里使用的是选择排序跟Java提供的排序做对比:

import java.util.Arrays;

/**
 * @author zhangzhixi
 * @version 1.0
 * @date 2021-8-20 0:00
 */
public class Demo {

    /*选择排序*/
    private static void choiceSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            /*假设第一个数是擂主*/
            int maxIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[maxIndex]) {
                    /*擂主易主*/
                    maxIndex = j;
                }
            }
            /*擂主不是先前的,就交换*/
            if (maxIndex != i) {
                swap(arr, i, maxIndex);
            }
        }
    }

    /**
     * 使用按位与运算进行交换数据
     *
     * @param arr 数组
     * @param i   数据
     * @param j   数据
     */
    public static void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

    /**
     * 插入排序
     * @param arr 数组数据
     */
    private static void insertSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int insertVal = arr[i + 1];
            int index = i;
            while (index >= 0 && insertVal < arr[index]) {
                arr[index + 1] = arr[index];
                index--;
            }
            arr[index + 1] = insertVal;
        }
    }

    /**
     * 定义一个绝对正确的比较器
     *
     * @param arr 数组
     */
    public static void comparator(int[] arr) {
        Arrays.sort(arr);
    }

    /**
     * 实现一个随机样本产生器
     *
     * @param maxSize  区间
     * @param maxValue 区间
     * @return 随机数组
     */
    public static int[] generateRandomArray(int maxSize, int maxValue) {
        //产生随机数范围为[0,maxSize]
        int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            //产生[-maxValue,maxValue]的元素
            arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
        }
        return arr;
    }

    /**
     * 拷贝数组
     *
     * @param arr 要进行拷贝的数组
     * @return 拷贝后的数组
     */
    public static int[] copyArray(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] res = new int[arr.length];
        /*使用System的这个拷贝,因为Arrays.copyOf底层也是使用的这个*/
        System.arraycopy(arr, 0, res, 0, arr.length);
        return res;
    }

    /**
     * 实现比对的方法
     *
     * @param arr1 数组1
     * @param arr2 数组2
     * @return 相同返回true,不同返回false
     */
    public static boolean isEqual(int[] arr1, int[] arr2) {
        if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
            return false;
        }
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1.length != arr2.length) {
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }

    /**
     * 如果有一个样本使得比对出错,打印样本分析是哪个方法出错
     *
     * @param arr 出错的数组
     */
    public static void printArray(int[] arr) {
        if (arr == null) {
            return;
        }
        for (int j : arr) {
            System.out.print(j + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        /*比较次数、最大区间、最小区间、是否比对成功*/
        int testTime = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean succeed = true;
        /*数组信息*/
        int[] arr1 = null;
        int[] arr2 = null;
        for (int i = 0; i < testTime; i++) {
            /*产生随机数组,并进行拷贝*/
            arr1 = generateRandomArray(maxSize, maxValue);
            arr2 = copyArray(arr1);
            /*对数组进行排序*/
            choiceSort(arr1);
            comparator(arr2);

            /*不相等*/
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                printArray(arr1);
                printArray(arr2);
                break;
            }
        }

        System.out.println(succeed ? "比对成功!" : "比对失败!");
        System.out.println("-----------成功比对后的数组---------------");
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }
}

测试结果:

 

 

 

posted @ 2021-08-20 10:42  Java小白的搬砖路  阅读(172)  评论(0编辑  收藏  举报