使用线程对Java中的ArrayList进行排序

使用线程对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.

我想使用线程二叉树对Java中的ArrayList进行排序。 问题如下:

main方法创建通过随机生成的列表的第一个节点。每个节点的行为方式都相同。如果列表有0或1个元素,则返回。否则,它将创建两个新节点,并将列表的两部分传递给它们。子节点对其列表进行排序后,父节点将合并这些列表并保持其排序

这是我到目前为止写的代码…
但是我不能让它工作!它会继续打印最后未排序的列表。
提前非常感谢你

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();而不是重新实例化,我做了!谢谢。