在ArrayList中对对象进行排序,给出意外的结果



这里的记录是类型员工的对象的数组列表。我正在尝试根据applyEnamame属性对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中介绍了有关此主题的其他帖子,并发现大多数帖子都暗示了相同的方式。我在这里做错了什么?

预先感谢!

您正在迭代record列表,并根据某些条件确定在哪里添加当前元素。但是,您不是先清除列表,因此这种方法不可避免地会导致重复。

java,幸运的是,具有用于排序的构建IT机制 - 您只需要实现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());

@howard Wang和Mureinik,你们是对的。添加(索引,对象)方法将对象添加到索引中,并正确地移动已经存在的对象,而不是替换它,这是我打算实现的目标。因此,添加record.remove(i 1);和record.emove(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);
            }   
        }
    }


}

最新更新