使用线程对Java中的ArrayList进行排序
我想使用线程二叉树对Java中的ArrayList进行排序。 问题如下: main方法创建通过随机生成的列表的第一个节点。每个节点的行为方式都相同。如果列表有0或1个元素,则返回。否则,它将创建两个新节点,并将列表的两部分传递给它们。子节点对其列表进行排序后,父节点将合并这些列表并保持其排序 这是我到目前为止写的代码…使用线程对Java中的ArrayList进行排序,java,multithreading,sorting,arraylist,binary-tree,Java,Multithreading,Sorting,Arraylist,Binary Tree,我想使用线程二叉树对Java中的ArrayList进行排序。 问题如下: main方法创建通过随机生成的列表的第一个节点。每个节点的行为方式都相同。如果列表有0或1个元素,则返回。否则,它将创建两个新节点,并将列表的两部分传递给它们。子节点对其列表进行排序后,父节点将合并这些列表并保持其排序 这是我到目前为止写的代码… 但是我不能让它工作!它会继续打印最后未排序的列表。 提前非常感谢你 Main.java import java.util.ArrayList; import java.util.
但是我不能让它工作!它会继续打印最后未排序的列表。
提前非常感谢你 Main.java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rnd = new Random();
List<Integer> list = new ArrayList<Integer>();
int size = rnd.nextInt(90) + 1 + 10;
for (int i = 0; i < size; i++) {
list.add(rnd.nextInt(100));
}
Node n = new Node(list);
n.start();
try {
n.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The sorted list:\n" + list.toString());
}
}
import java.util.ArrayList;
import java.util.List;
public class Node extends Thread {
private List<Integer> list;
public Node(List<Integer> list) {
this.list = list;
}
public void run() {
if (list.size() <= 1)
return;
List<Integer> l1, l2;
l1 = new ArrayList<Integer>();
l2 = new ArrayList<Integer>();
add(l1, 0, list.size() / 2);
add(l2, list.size() / 2, list.size());
Node a, b;
a = new Node(l1);
b = new Node(l2);
a.start();
b.start();
try {
a.join();
b.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
merge(l1, l2);
}
private void add(List<Integer> l, int from, int to) {
l.addAll(list.subList(from, to));
}
private void merge(List<Integer> l1, List<Integer> l2) {
list = new ArrayList<Integer>();
int size1 = l1.size();
int size2 = l2.size();
int i1 = 0, i2 = 0, n1, n2;
while (i1 < size1 && i2 < size2) {
n1 = l1.get(i1);
n2 = l2.get(i2);
if (n1 <= n2) {
list.add(n1);
i1++;
} else {
list.add(n2);
i2++;
}
}
while (i1 < size1) {
list.add(l1.get(i1++));
}
while (i2 < size2) {
list.add(l2.get(i2++));
}
}
}
import java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
公共班机{
公共静态void main(字符串[]args){
随机rnd=新随机();
列表=新的ArrayList();
int size=rnd.nextInt(90)+1+10;
对于(int i=0;i
Node.java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rnd = new Random();
List<Integer> list = new ArrayList<Integer>();
int size = rnd.nextInt(90) + 1 + 10;
for (int i = 0; i < size; i++) {
list.add(rnd.nextInt(100));
}
Node n = new Node(list);
n.start();
try {
n.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The sorted list:\n" + list.toString());
}
}
import java.util.ArrayList;
import java.util.List;
public class Node extends Thread {
private List<Integer> list;
public Node(List<Integer> list) {
this.list = list;
}
public void run() {
if (list.size() <= 1)
return;
List<Integer> l1, l2;
l1 = new ArrayList<Integer>();
l2 = new ArrayList<Integer>();
add(l1, 0, list.size() / 2);
add(l2, list.size() / 2, list.size());
Node a, b;
a = new Node(l1);
b = new Node(l2);
a.start();
b.start();
try {
a.join();
b.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
merge(l1, l2);
}
private void add(List<Integer> l, int from, int to) {
l.addAll(list.subList(from, to));
}
private void merge(List<Integer> l1, List<Integer> l2) {
list = new ArrayList<Integer>();
int size1 = l1.size();
int size2 = l2.size();
int i1 = 0, i2 = 0, n1, n2;
while (i1 < size1 && i2 < size2) {
n1 = l1.get(i1);
n2 = l2.get(i2);
if (n1 <= n2) {
list.add(n1);
i1++;
} else {
list.add(n2);
i2++;
}
}
while (i1 < size1) {
list.add(l1.get(i1++));
}
while (i2 < size2) {
list.add(l2.get(i2++));
}
}
}
import java.util.ArrayList;
导入java.util.List;
公共类节点扩展线程{
私人名单;
公共节点(列表){
this.list=列表;
}
公开募捐{
如果(list.size()您没有看到处于合并状态的原始列表,因为您在merge()
方法中要做的第一件事是扔掉您持有的原始列表的引用:
private void merge(List<Integer> l1, List<Integer> l2) {
list = new ArrayList<Integer>();
...
private void合并(列表l1、列表l2){
列表=新的ArrayList();
...
所有已排序数据的实际合并都发生在您创建的新列表中,但您正在main()
方法中打印原始的未排序List
您需要对原始列表中的元素进行排序,或者以某种方式返回(新)排序的元素。Holy****,就是这样…List.clear();而不是重新实例化,我做了!谢谢。