2012-03-21 3 views
0

Я пытаюсь изучить Java самостоятельно, и один из вопросов в книге передал мне, но мне. Речь идет о слиянии двух ArrayList после сортировки их стиля MergeSort. Я не могу объединить их вместе без серьезного бедствия. Я действительно хочу знать это, чтобы я мог двигаться дальше, это сводит меня с ума.Невозможно объединить двух архиваристов

public <E extends Comparable<?super E>> void merge(List<E> front, List<E> back, boolean last, List<E> result){ 
    int i = 0; 
    int j = 1; 
    while (!front.isEmpty() && !back.isEmpty()) { 
     if (front.get(0).compareTo(back.get(0)) <= 0) { 
      result.add(result.size() -1, front.remove(0)); 
      System.out.println("works" + result); 
      } else { 
      result.add(result.size() -1, back.remove(0)); 
      System.out.println("no work" + result); 
      } 
    } 
    while (!front.isEmpty()) { 
     result.add(result.size() -1,front.remove(0)); 
    } 
    while (!back.isEmpty()) { 
     result.add(result.size() - 1, back.remove(0)); 
    } 
System.out.println(); 
} } 

Булево значение должно сортировать их в: true == по возрастанию, false == убывающий порядок. Я мог бы беспокоиться об этом. Любые виды помощи будут оценены.

+2

* "... и один из вопросов в книге передал мне, но мне" *. Что это за язык? Это не похоже на английский. (Пожалуйста, помните, что есть люди старше 21 года, читающие это, и люди, чей первый язык не является английским.) –

+2

Что вы подразумеваете под «серьезным бедствием»? Что, в частности, идет не так? Вызывает ли это исключение? Разве это не компилируется? Возвращает ли он неожиданный результат? –

ответ

0

Если ваши сортировщики отсортированы, проведите через них и просто возьмите минимальный элемент на одном конце (при условии, что вы хотите по возрастанию). Сделайте это до тех пор, пока один из списков не станет пустым. Затем просто добавьте записи в оставшийся список в объединенный список.

+0

вы должны извинить меня, я все еще не понимаю. – IC2D

+0

@ user1217522less см. Http://www.algolist.net/Algorithms/Merge/Sorted_arrays и http://stackoverflow.com/questions/5958169/how-to-merge-two-sorted-arrays-into-a-sorted -array – Adrian

1

Я думаю, что все, что вам нужно сделать, это внести следующие изменения

result.add(front.remove(0)); 

и то же самое изменение в предложении другого.

Чтобы добавить элемент в конце списка результатов, вы не должны указывать индекс.

0

Ну, один безопасный метод, который я использовал для реализации слияния, был чем-то вроде следующего.

public <E extends Comparable<? super E>> void merge(List<E> front, 
      List<E> back, boolean last, List<E> result) { 
     int i = 0; 
     int j = 0; 
     Collections.sort(front); 
     Collections.sort(back); 
     while (!(i == front.size() && j == back.size())) { 
      E e; 
      if (i == front.size()) { 
       // If we have exhausted the 'front' then copy whatever is in 
       // 'back' 
       e = back.get(j); 
       // Move back index to next 
       j++; 
      } else if (j == back.size()) { 
       // If we have exhausted the 'back' then copy whatever is in 
       // 'front' 
       e = front.get(i); 
       // Move front index to next 
       i++; 
      } else { 
       if ((front.get(i).compareTo(back.get(j)) <= 0)) { 
        // front item will be added, increment front index for next 
        e = front.get(i); 
        i++; 
       } else { 
        // back item will be added, increment back index for next 
        e = back.get(j); 
        j++; 
       } 
      } 
      result.add(e); 
     } 
     if(last){ 
      Collections.reverse(result); 
     } 
    } 
Смежные вопросы