2013-08-06 3 views
-3

Я слышал о Bucket Sorting. Может ли кто-нибудь объяснить, как он дает лучшую производительность при сортировке миллионов записей? Есть ли какой-либо алгоритм с n*log(n) или O(n) ?Bucket Сортировка или сортировка арраиста объектов на основе Id?

У меня есть 1000 объектов-сотрудников каждый объект-сотрудник имеет идентификатор, имя, свойства зарплаты. Я добавил эти объекты в ArrayList Я хочу, чтобы sort эти объекты на основе свойства id. Там в любом случае? Без использования метода Collections.sort(). Рассматриваемые ниже решения, пожалуйста, кто-нибудь поможет, который дает лучшую производительность?

Благодаря

+2

Да. Это называется Comparable и Comparator с тире Collections.sort: D – Thihara

+0

@Thihara Мое требование не использовать метод Collections.sort() – MaheshVarma

+1

Эта ссылка очень помогает http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-1/ –

ответ

3

Без коллекций.сортировать():

Сначала реализовать Comparable<Employee> в классе Empoloyee и переопределить compareTo

@Override 
public int compareTo(Employee o) { 

    return this.id.compareTo(o.id); 
} 

Пройди свой несортированный список TreeSet и получить set (отсортированы по идентификатору), а затем создать new List с этим set

List<Employee> list=new ArrayList<Employee>(); 
    list.add(new Employee(1, "A", Double.parseDouble("50"))); 
    list.add(new Employee(22, "B", Double.parseDouble("11"))); 
    list.add(new Employee(3, "C", Double.parseDouble("222"))); 
    list.add(new Employee(34, "D", Double.parseDouble("4"))); 

    SortedSet<Employee> set=new TreeSet<Employee>(list); 

    List<Employee> l=new ArrayList<Employee>(); 
    l.addAll(set); 

    System.out.println(l); 

OutPut: Отсортировано по ID без Collections.sort()

[Employee [id=1, name=A, price=50.0], Employee [id=3, name=C, price=222.0], Employee [id=22, name=B, price=11.0], Employee [id=34, name=D, price=4.0]] 

Edit:

класс Employee:

class Employee implements Comparable<Employee>{ 

Integer id; 
String name; 
Double price; 
     ------- 

} 
+0

. Свойство id - это целое число, а не строка, но метод compareTo() поддерживает только сравнение строк. – MaheshVarma

+0

'return this.id.compareTo (o.id);' это раздел, который использует 'String'. Если вы используете здравый смысл, это может быть легко заменено целыми сравнениями. – christopher

+1

Добавлен класс Employee, где in - Integer not String. Однако методы compareTo переопределяются в классах Integer, String и Date.Plz проверить API – amicngh

1
My requirement is not to use Collections.sort() method 

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

0

Вы можете использовать этот код для сортировки списка:

Collections.sort(list, new Comparator() { 
    public int compare(Object a, Object b) { 
     Employee ea = (Employee) a; 
     Employee eb = (Employee) b; 
     return ea.getID() - eb.getID(); 
    } 
} 

Это использует Collections.sort для сортировки списка с настраиваемым компаратора, который сравнивает идентификаторы.

Если вы не можете использовать Collections.sort, то, конечно же, ваш учитель рассказал вам, как сортировать список? Возможно, он заплатит, чтобы обратить внимание на лекции.

3
public class Employee implements Comparable<Employee> { 

private int id; 
private String name; 
private String salary ; 

public int compareTo(Employee val) { 
     if(id>val.id){ 
     return 1; 
    }else if(id<val.id){ 
     return -1; 
    } else { 
     return 0; 
    } 
} 

//getter and setters here 
} 

и теперь вы можете создать список

List<Employee> emp= new ArrayList<Employee>(); 

Теперь вы можете использовать

Collections.sort(emp); 

сортировать по идентификатору

+0

Что вы подразумеваете под Employee.val? – MaheshVarma

+1

Да, это была ошибка, Исправлено. –

+0

В моем случае id не является строкой, это целое число – MaheshVarma

3

The ArrayList может хранить элемент в ArrayFormat. Если вы идентифицируете сотрудника-пользователя по id, вы можете использовать класс HashTable, который использует пару ключей и значений, в противном случае вы можете реализовать свой класс, используя интерфейс Comparable.

public class Employee implements Comparable<Employee> { 

    private String id; 
    private String name; 
    private int salary ; 

    public int compareTo(Employee val) { 
     return id.compareTo(val.id); 
    } 

    // getter and setters here... 

    List<Employee> emp = new ArrayList<Employee>(); 
    Collections.sort(emp); 
-1

сначала преобразовать его в список вашего класса:

List<Employee> list = new List<Employee>(arraylist); 

var sorted = list.OrderBy(o => o.id).ToList(); 
+0

is => работает оператор с jdk 6? – MaheshVarma

+0

Более того, 'List' - это интерфейс. Вы не можете создать экземпляр. В Java нет 'var'. Ваш код выглядит как C#. –