Есть ли способ заставить функцию вызывать другую функцию в своем параметре? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть метод с именем sortTest(), который принимает число и sortName().Число, которое он будет принимать, станет размером созданного массива, а sortName() должно быть именем вида, который он будет делать.

Например, если у меня есть sortTest(5, bubbleSort), он должен создать массив из 5 со случайными числами, а затем взять этот массив из 5 с помощью пузырьковой сортировки.Вот мой код:

public static final int loopSize = 16; 
    public static int[] makeArray(int n) { 
        int[] array = new int[n]; 

        for(int d = 0; d < loopSize; d++ ) { 

            Random r = new Random(); 

            for(int i = 0; i < n; i++) { 

                for(int k = 0; k < n; k++) { 

                    array[k] = (int)( Math.random()* 1000); 

                } 

            } 

        } 

        return array; 

    } 

public static void sortTest(int num , sortName() ) { 

    long Finaltime []; 

    for(int k = 0; k < loopSize; k++ ) { 

        arr = makeArray(num); 

        long startTime = System.nanoTime(); 

        sortName(arr); 

        endTime = System.nanoTime(); 

        totalTime = endTime - startTime; 

    } 

} 

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Нет, вы не можете передать свой метод sortName() в качестве параметра другому методу (по крайней мере, не так), как и вы.Я думаю, что лучшим решением в вашем случае является использование статического метода.

В Java статический метод вызывается напрямую, без необходимости создавать экземпляр(объект) класса, в котором он содержится (подробности см. в ответах на этот вопрос).В этом контексте вы можете объявить sortName() следующим образом:

public MyClass {
    public static void sortName(long[] array) {
        //your code here
    }
}

Затем, когда вам нужно вызвать его за пределами MyClass, все, что вам нужно сделать, это использовать следующий синтаксис: MyClass.sortName(myArray).В вашем коде это будет выглядеть так:

public static void sortTest(int num) { 
    //...
    MyClass.sortName(arr);
    //...
} 
0 голосов
/ 24 сентября 2018

Примечание. Этот ответ основан на Java 8 и новее.Это не относится к Java 7, так как Java 7 не поддерживает Lambda

Определение интерфейса SortType

interface SortType {
    void sortName(int[] data);
}

Запись тестовых случаев

public class Test {
    public static final int loopSize = 16;

    public static int[] makeArray(int n) {
        int[] array = new int[n];
        for (int d = 0; d < loopSize; d++) {
            Random r = new Random();
            for (int i = 0; i < n; i++) {
                for (int k = 0; k < n; k++) {
                    array[k] = (int) (Math.random() * 1000);
                }
            }
        }
        return array;
    }

    // Pass functional SortType interface
    public static void sortTest(int num, SortType sortType) {

        long Finaltime[];
        for (int k = 0; k < loopSize; k++) {
            int[] arr = makeArray(num);
            long startTime = System.nanoTime();
            sortType.sortName(arr);
            long endTime = System.nanoTime();
            long totalTime = endTime - startTime;
        }
    }
}

Выполнениеконтрольный пример с использованием основного метода

public static void main(String[] args) {
        // define which algorithm need to call
        SortType bubbleSort = (int[] data) -> Arrays.sort(data);
        SortType bubbleSortOnlyLastThree = (int[] data) -> Arrays.sort(data, 2, 5);
        sortTest(5, bubbleSort);
        sortTest(5, bubbleSortOnlyLastThree);
    }
0 голосов
/ 24 сентября 2018

Есть много разных способов сделать это.Возможно, вы захотите проверить функциональную документацию: https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

В вашем случае вы, вероятно, захотите изменить свою функцию верхнего уровня на потребителя других функций.

Что-то вроде:

public static void sortTest(int num, BiFunction<Integer, Integer, Integer> sortFunction) {...}

(В данном случае это BiFunction или его называют sortFunction.apply(int, int) returning an int

Функциональные интерфейсы немного неуклюжи в Java, но ониработают нормально (и были в той или иной форме в течение довольно долгого времени). В Java 1.8 и более поздних версиях есть более формальная поддержка лямбд, что делает их более удобными.

По сути, это просто интерфейсэто может быть функцией. Затем вы можете создать функции сортировки с разными именами:

BiFunction<Integer, Integer, Integer> ascending = (a,b) -> { ... return sort; //-1 0 1};
BiFunction<Integer, Integer, Integer> descending = (a,b) -> { return ascending.apply(b, a) };
...etc...

Затем они могут быть переданы вашему статическому методу:

...
YourClass.sortTest(10, ascending)
...

Надеемся, что это укажет на васправильное направление. Похоже, вы новичок в Java, не бойтесь задавать вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...