将java代码排序函数作为函数接口传递给测试方法

ef1yzkbh  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(347)

我有像bubblesort(args)和mergesort(args)这样的排序函数。我该如何让它们可以通过其他方法来测试执行时间等等。
我正在考虑使用单个方法sort()创建函数接口,但是mergesort需要另一个方法merge()。我可以在main中手动完成,但是我想知道是否有更好的方法来测试许多排序函数。
那么像这样的事情也许是

public static void testSorting(Integer arr[], String name, SortingFunction<Integer> func ){
     long start = System.nanoTime();
     func.sort(arr);
     long stop = System.nanoTime();
     //lots of testing strings some stuff i dont wanna copy paste it in main 
 }

public Interface SortingFunction <T> {
   public /*T*/ sort(); //need just a single function right so merge sort cant be coded here?
}

我有这样的想法:

SortingFunc bubbleSort = new SortingFunc() {
        @Override
        public void sort(int[] arr) {
            int tmp;
            for (int j = 0; j < arr.length; j++) {
                for (int i = 1; i < arr.length - j; i++) {
                    if (arr[i - 1] > arr[i]) {
                        tmp = arr[i - 1];
                        arr[i - 1] = arr[i];
                        arr[i] = tmp;
                    }
                }
            }
        }
    };

    SortingFunc mergeSort = new SortingFunc() {
        @Override
        public void sort(int[] arr) {

        }
    }

但我不知道如何将递归编码到mergesort函数中。我试着这样做:

SortingFunc mergeSort = new SortingFunc() {
        @Override
        public void sort(int[] arr) {
            class Local {
                void mergeSort(int[] a, int n) {
                    //do merge sorting
                }

                new Local().mergeSort();  //compilation error
            }
        }
    };

但是我得到编译错误:java:非法的类型开头

已解决

格式被关闭了,我把新的放在了班级正文里。应该是的

class Local {
                void mergeSort(int[] a, int n) {
                    //do merge sorting
                }

            }
            new Local().mergeSort(arr, arr.length);

我向你们介绍我的主要方法:

public static void main(String[] args) {

        SortingFunc bubbleSort = new SortingFunc() {
        @Override
        public void sort(int[] arr) {
           //bubble sort... 

        }
    };

    SortingFunc mergeSort = new SortingFunc() {
        @Override
        public void sort(int[] arr) {
            class Local {
                void mergeSort(int[] a, int n) {
                    //merge sort....
                }

            }
            new Local().mergeSort(arr, arr.length);
        }
    };

    System.out.println(test(getNonRepeatableRandomArray(1000),bubbleSort));

    System.out.println(test(getReversedSortedArray(1000), mergeSort));

感谢您的帮助,它工作正常,看起来棒极了,应该能让我在未来的需要中坚持一段时间。接下来将把排序算法作为一个对象存储在一个文件中或者可以从web下载。

eoxn13cs

eoxn13cs1#

好样的。这么少的代码,这么多的内容!

错误的样式1:后缀数组表示法。 Integer arr[] 在很多方面都是错误。这是一个风格错误;我们用java编写 Integer[] arr . Integer arr[] 合法,但不推荐;混合空格和制表符也是合法的,但也不要这样做。30年前,java被创造出来,从语法Angular 看,它与c非常相似,在c中,这是合法的,而且有些常见。但是java不是c语言,一点也不像。这个策略奏效了;大量的c程序员采用java。但这确实意味着有很多方法可以编写技术上合法的代码,但是,没有。

错误的样式2:整数而不是int

其次, Integer 是对象 Package 器。你不会想要的。你想要什么 int . integer是一个指针,如果底层的整数都分布在内存中,则主要是测量缓存线的性能。 int[] 至少保证连续的内存。

那不是你计时的方式

java太复杂了,不能用这样的时间。使用jmh。你可以在网上搜索你为什么需要这个,原因有很多。从隔离“哦,你的winamp切换歌曲”到热点规范化。

仿制药滥用

泛型把事物联系起来。你用你的 T 在一个地方,这(几乎)总是错误的。把它移到这里。

代码已断开

您有一个排序方法,该方法在 SortingFunction 函数接口,但随后要传递一个数组,这显然无法工作。

答案

大概你想要这样的东西:

@FunctionalInterface
public interface IntSorter {
    void sort(int[] arr);
}

并定义排序函数,它将“就地”排序(它将修改 arr ),这意味着您的框架代码每次都需要创建一个新的arr,或者将int数组中的每个元素重写回原始状态,这可能更“公平”(内存位置问题不会影响计时的可能性更大)。

相关问题