Сортировка Arraylist с использованием Bubblesort параллельно с пулом fork / join - PullRequest
0 голосов
/ 27 сентября 2019

Итак, я пытаюсь отсортировать ArrayList с помощью пула Fork / Join.Алгоритм, который я буду использовать для сортировки, не имеет значения: я просто выбрал случайный.Важно то, как я должен использовать рекурсивную задачу с пулом fork / join, чтобы ArrayList продолжал разделяться до тех пор, пока размер ArrayList не достигнет определенного числа (например, 1000), затем он выполнит сортировку и затем снова присоединится кодин ArrayList.Вот мой код:

assignment5

public class assignment5 {

    ArrayList<Integer> numbers = new ArrayList<>();
//lets say this arraylist is full with random numbers

    public void run(){

        Instant start = Instant.now();

        MyRecursiveTask myRecursiveTask = new MyRecursiveTask(numbers);
        ArrayList<Integer> mergedResult = ForkJoinPool.invoke(myRecursiveTask);

        Instant end = Instant.now();

        Duration duration = Duration.between(start, end);
        System.out.println("Seconds: " + duration.getSeconds());

    }

}

здесь в назначении 5 выдает ошибку на ForkJoinPool.invoke(myRecursiveTask); он говорит, что вызов статического метода не может быть связан со статическим контентом

MyRecursiveTask

    private List<Integer> numbers;

    protected List<Integer> compute() {
        //numbers here is the same as in assignment 5
        //if work is above threshold, break tasks up into smaller tasks
        if(this.numbers.size() > 1000) {
            System.out.println("Splitting workLoad : " + this.numbers.size());

            List<MyRecursiveTask> subtasks = new ArrayList<MyRecursiveTask>();
            subtasks.addAll(createSubtasks());

            for(MyRecursiveTask subtask : subtasks){
                subtask.fork();
            }

            for(MyRecursiveTask subtask : subtasks) {
                subtask.join();
            }
            return numbers;

        } else {
            System.out.println("Doing workLoad myself: " + this.numbers.size());
            bubbleSort(numbers);
        }
        return numbers;
    }

    private List<MyRecursiveTask> createSubtasks() {
        List<MyRecursiveTask> subtasks = new ArrayList<MyRecursiveTask>();

        List<Integer> list1 = numbers.subList(0,numbers.size()/2);
        List<Integer> list2 = numbers.subList(numbers.size()/2, numbers.size());

        MyRecursiveTask subtask1 = new MyRecursiveTask(list1);
        MyRecursiveTask subtask2 = new MyRecursiveTask(list2);

        subtasks.add(subtask1);
        subtasks.add(subtask2);

        return subtasks;
    }
    public void bubbleSort(List<Integer> numbers){//bubble sort alg here}
}

1 Ответ

0 голосов
/ 27 сентября 2019

ForkJoinPool.invoke () является , а не статическим методом, но вы используете как есть.

Вам необходимо создать экземпляр ForkJoinPoolи назовите invoke этого экземпляра.Также вам понадобится явное приведение, чтобы заставить вещи работать так, как вы хотели (об этом ArrayList).

Замените строку, которая дает вам "error" , этими, и она будетработа!

ForkJoinPool forkJoinPool = new ForkJoinPool();
ArrayList<Integer> mergedResult = (ArrayList<Integer>) forkJoinPool.invoke(myRecursiveTask);

Надеюсь, я помог!

PS: Если вы еще этого не сделали, я предлагаю вам прочитать комментарии других пользователей, вы можете найтиим полезно.

...