在ArrayList中对对象进行排序会产生意外结果

时间:2015-05-14 05:33:11

标签: java sorting 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中有关此主题的其他帖子,发现大多数帖子都提出了同样的建议。我在这里做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

@Howard Wang和Mureinik,你们是对的。 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);

            }   

        }

    }




}