2015-05-14 2 views
1

Здесь находится ArrayList объектов типа Employee. Я пытаюсь сортировать ArrayList на основе атрибута employeeName. К сожалению, это дает нежелательные результаты.Сортировка объектов в ArrayList, дающих неожиданные результаты

public void sortByName(){  
    for(int i = 0; i < SalesDataManager.N; i++){ 
     for(int j = i+1; j < SalesDataManager.N; j++){    
      if(record.get(i).getEmployeeName().compareToIgnoreCase(record.get(j).getEmployeeName()) > 0){       
       Employee etemp = record.get(i); 
       record.add(i,record.get(j)); 
       record.add(j,etemp);      
      }      
     }   
    }  
    displayAllRecords(); 
} 

Я прошел через другие посты в StackOverflow по этой теме и выяснил, что большинство поста предложить такой же way.Am я делаю что-то здесь не так?

Заранее благодарен!

+3

Каков ожидаемый результат? & what is output? – underdog

+1

Использовать Collections.sort и передавать в компараторе – Simon

+0

Изменяет список как итерацию через это ваше намеренное действие? – user2829759

ответ

3

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

Java, к счастью, имеет встроенный механизм его для такой сортировки - вам просто нужно реализовать Comparator:

public class EmployeeNameComparator implements Comparator<Emplyoee> { 
    @Override 
    public int compare (Employee a, Employee b) { 
     return a.getEmployeeName().compareToIgnoreCase(b.getEmployeeName()); 
} 

А затем просто использовать:

Collections.sort (record, new EmployeeNameComparator()); 

Если вы используете Java 8, вы также можете использовать новый синтаксис уборщика:

Collections.sort 
    (record, (a, b) -> a.getEmployeeName().compareToIgnoreCase(b.getEmployeeName()); 
+0

К сожалению, я не могу использовать встроенный метод сортировки. Это задание, и я должен сделать это классическим способом! Есть дубликаты, как вы уже упоминали, что, вероятно, связано с методом add (index, object) ArrayList. Я хочу поменять положение объектов. – freerunner

0

@Howard Wang and Mu reinik, вы, ребята, были правы. Метод add (index, object) добавил объект к индексу и изменил уже существующий объект, вместо того, чтобы его заменять, и это было тем, чего я собирался достичь. Итак, добавив record.remove (i + 1); и record.remove (j + 1); к коду сделала трюк!

public void sortBySales() 
{ 



    for(int i = 0; i < SalesDataManager.N; i++) 
    { 
     for(int j = i+1; j < SalesDataManager.N; j++) 
     { 

      if(record.get(i).getEmployeeSales() > record.get(j).getEmployeeSales()) 
      { 


       Employee etemp = record.get(i); 
       record.add(i,record.get(j)); 
       record.remove(i+1); 
       record.add(j,etemp); 
       record.remove(j+1); 

      } 

     } 

    } 




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