这里记录是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中有关此主题的其他帖子,发现大多数帖子都提出了同样的建议。我在这里做错了什么?
提前致谢!
答案 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)
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);
}
}
}
}