2015-03-02 2 views
0

Это код, который у меня есть, и все работает нормально. Что мне смущает, как сравнить новые предметы, добавленные в arraylist? Я смотрел на компаратора, но я не думаю, что это подходит для этой ситуации? Возможно, я ошибаюсь, но я не могу понять логику этого. Я собирался сделать это вручную, но потом понял, что это, вероятно, не умная идея. Как создать алгоритм сортировки вставки? Я собирался использовать последовательный метод сортировки, но я чувствую, что что-то не хватает. Может ли кто-нибудь пролить свет?Как отсортировать постоянно растущий arraylist?

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import java.util.Scanner; 

public class lab06 { 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     String entry; 
     boolean loop = true; 

     List<Integer> list = new ArrayList<Integer>(); 
     System.out.println("Simple Sorting Program"); 
     System.out.println(""); 
     System.out.println("======================"); 
     System.out.println(""); 
     System.out.println("At start this list contains: " + list);  
     System.out.println(""); 

     while(loop = true){ 

      System.out.print("Enter val (neg to end): "); 
      entry = input.next(); 

      if (entry.charAt(0) !='-'){ 
       Integer val = Integer.valueOf(entry); 
       list.add(val); 
       System.out.println("List now contains: " + list); 
      } 
      else{ 
       loop = false; 
       System.out.println("At end, list contains: "+ list); 
       System.out.println("Goodbye!");     
      }     
     } 
    } 
+4

Основным ответом было бы не так. После сортировки вы должны вычислить место, где нужно будет вставить следующее значение и вставить его напрямую. Вы можете использовать какой-то бинарный алгоритм поиска, чтобы попытаться вычислить предпочтительное место, где должен быть вставлен элемент. – MadProgrammer

+3

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#binarySearch% 28java.util.List,% 20T,% 20java.util.Comparator% 29 вычислит точку вставки в отсортированном списке. –

+3

Почему бы не использовать 'TreeSet' вместо этого? Вам действительно нужны обманы? –

ответ

0

Как указано @MadProgrammer, лучший способ заключается в использовании алгоритма поиска, в частности, алгоритм двоичного поиска является достаточно эффективным в O (LogN), а затем вставить значение данных в контексте.

+0

Я использовал метод, похожий на него, в конечном итоге шел последовательно, но ваш ответ является самым близким, поэтому для любой будущей ссылки это, вероятно, лучший выбор. –

0

Если нет необходимости использовать Список или обратиться к своим записям с использованием номера элемента ввода, вы можете рассмотреть возможность замены своего списка TreeBag из сообщества apache.

Это реализует интерфейс Collection и будет внутренне поддерживать естественный порядок элементов (в данном случае целые) при добавлении новых значений. Они будут перечислены в порядке через Iterator и неявно через метод toString() при печати содержимого.

#include org.apache.commons.collections4.bag.TreeBag; 

... 

Collection<Integer> list = new TreeBag<Integer>(); 

... 

Для использования этого нужно загрузить commons-collections.jar и включить его в пути к классам при выполнении программы.