gpt4 book ai didi

java - 将 Arraylist 一分为二并使用不同的线程对其进行排序

转载 作者:行者123 更新时间:2023-12-02 00:43:00 26 4
gpt4 key购买 nike

所以我想做的是有一个主线程将 ArrayList 分成 2 个,然后将启动另外 2 个线程,这些线程在完成对主线程的排序后将使用冒泡排序对每一半进行排序将两半合并为一个已排序的 ArrayList。您能告诉我哪里错了吗

这是主类:

import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;

public class Assignment3 implements Runnable {
public static void main(String[] args) {

Thread t0 = new Thread(new Assignment3());
t0.start();
}

public void run(){
generateNumbers();
Instant begin = Instant.now();

List<Integer> numbers1 =numbers.subList(0,numbers.size()/2);
List<Integer> numbers2 =numbers.subList((numbers.size()/2)+1,numbers.size() - 1);

Thread1 t1 = new Thread1(numbers1);
Thread1 t2 = new Thread1(numbers2);
t1.start();
t2.start();

try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

ArrayList<Integer> newNumbers1 =t1.getArray();
ArrayList<Integer> newNumbers2 =t2.getArray();

ArrayList<ArrayList<Integer>> numbersAll = new ArrayList<>();
numbersAll.add(newNumbers1);
numbersAll.add(newNumbers2);

Instant end = Instant.now();

Duration duration = Duration.between(begin, end);

System.out.println(numbers);
System.out.println(duration.getSeconds() + " Seconds");
}
ArrayList<Integer> numbers = new ArrayList<>();

public void generateNumbers(){
for (int i = 0; i <25000 ; i++) {
int number = (int)(Math.random()*25000)+1;
numbers.add(number);
}
}
}

这是线程类:

import java.util.ArrayList;
import java.util.List;

public class Thread1 extends Thread {

public List<Integer> numbers;

public Thread1(List<Integer> numbers) {
this.numbers=numbers;
}
@Override
public void run() {
int n = numbers.size();
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n - i - 1; j++){
if (numbers.get(j) > numbers.get(j + 1)) {
// swap arr[j+1] and arr[i]
int temp = numbers.get(j);
numbers.set(j, j + 1);
numbers.set(j + 1, temp);
}
}
}

}
public ArrayList<Integer> getArray(){
return (ArrayList<Integer>) numbers;
}

}

此外,这是我运行时收到的错误:线程“Thread-0”中的异常 java.lang.ClassCastException:java.util.ArrayList$SubList 无法转换为 java.util.ArrayList 在 Thread1.getArray(Thread1.java:27) 在Assignment3.run(Assignment3.java:32) 在 java.lang.Thread.run(Thread.java:748)

最佳答案

上述错误的原因是以下行

return (ArrayList<Integer>) numbers;

您无法施放numbers其数据类型是List的子类,即ArrayList。您可以将其替换为

return new ArrayList<Integer>(numbers);

这将创建一个新的 ArrayList,其中包含 List 中的元素。

虽然这可以解决您遇到的错误,但它并不能满足原始问题的要求。对 2 个子列表进行排序后,您需要使用 here 中描述的逻辑合并它们。获取一个已排序的 ArrayList。

关于java - 将 Arraylist 一分为二并使用不同的线程对其进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57920822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com