Я хочу сортировать ArrayList в Java с использованием двоичного дерева потоков. Проблема заключается в следующем:Сортировка ArrayList в Java с помощью потоков
Основной метод создает первый узел, передающий случайно сгенерированный список. Каждый узел ведет себя одинаково. Если список имеет 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++));
}
}
}
Holy ****, вот и все ... list.clear(); вместо того, чтобы переустановить это сделал! Спасибо. –