【问题标题】:Sorting an ArrayList in Java using Threads使用线程在 Java 中对 ArrayList 进行排序
【发布时间】:2015-04-13 18:58:09
【问题描述】:

我想使用线程二叉树对 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());
    }
}

Node.java

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++));
        }
    }
}

【问题讨论】:

    标签: java multithreading sorting arraylist binary-tree


    【解决方案1】:

    您没有看到原始List 处于合并状态,因为您在merge() 方法中做的第一件事就是丢弃您持有的原始List 的引用:

    private void merge(List<Integer> l1, List<Integer> l2) {
        list = new ArrayList<Integer>();
        ...
    

    所有排序数据的实际合并都发生在您创建的新 List 中,但您在 main() 方法中打印原始的、未排序的 List

    您需要对原始List 的元素进行排序,或者以某种方式返回(新)排序的元素。

    【讨论】:

    • 天啊,就是这样... list.clear();而不是重新实例化它!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2014-07-05
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多