2015-04-13 6 views
1

Я хочу сортировать 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++)); 
     } 
    } 
} 

ответ

2

Вы не видите оригинальный List в объединенном государстве, потому что первое, что вы делаете в вашей merge() метод выбрасывает ссылку, которую вы держали в оригинале List:

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

Все фактического слияния отсортированных данных происходит в новой List вы сделали, но вы печатаете оригинал, несортированный List в методе main().

Вам необходимо либо отсортировать элементы оригинала List, либо вернуть (новый) отсортированный как-то.

+0

Holy ****, вот и все ... list.clear(); вместо того, чтобы переустановить это сделал! Спасибо. –

Смежные вопросы