Rob*_*ert 7 java sorting queue treemap comparator
假设我有一个包含工人的列表,每个工人有3个字段:它的名称,他所在的部门(可以只是部门的名称或班级部门的对象)和他的工资.
Elvis Software Engineering 1000
Samba Mechanical Engineering 2000
Bamba Industrial Engineering 3000
Bisli Medical Engineering 4000
Kinder Electrical Engineering 1000
Elvis Software Engineering 9999
Run Code Online (Sandbox Code Playgroud)
现在我想按名字对它们进行排序,并将结果放入队列中.然后将队列放在地图中,从底部到顶部排序,以便排序后我想要的结果是:
Bamba Industrial Engineering 3000
Bisli Medical Engineering 4000
Elvis Software Engineering 1000
Elvis Software Engineering 9999
Samba Mechanical Engineering 2000
Kinder Electrical Engineering 1000
Run Code Online (Sandbox Code Playgroud)
我不允许使用Collection.sort(),因此我使用比较器按名称对工人进行排序,如果名称相同 - 按部门排序,如果部门相同 - 按类别排序薪水.这是我写的比较器:
class WorkerComparatorByName implements Comparator<Worker<?>> {
@Override
public int compare(Worker<?> w1, Worker<?> w2) {
int compareValue = w1.getName().compareTo(w2.getName());
if (compareValue != 0)
return compareValue;
compareValue = w1.getDepartment().toString().compareTo(w2.getDepartment().toString());
if (compareValue != 0)
return compareValue;
return w1.getSalary() - w2.getSalary();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是结果如下:
Bamba Industrial Engineering 3000
Bisli Medical Engineering 4000
Elvis Software Engineering 1000
Samba Mechanical Engineering 2000
Kinder Electrical Engineering 1000
Elvis Software Engineering 9999
Run Code Online (Sandbox Code Playgroud)
所有工作人员都被排序,但是Elvis(重复的)没有排序,它停留在队列的末尾.我尝试用另一个重复的名称替换Elvis,结果相同.我错过了什么?我怎样才能对重复值进行排序,以便它们一个接一个?这是代码:
public <T extends Worker<?>> Map<?, ?> createMap(ArrayList<T> list) {
int i = 1;
// creating a PriorityQueue sorted by names
Queue<T> pq = new PriorityQueue<>(new WorkerComparatorByName());
// filling the PriorityQueue with the workers
pq.addAll(list);
Map<Integer, T> treeMap = new TreeMap<Integer, T>();
// iterating over the PriorityQueue and puting the workers in the map
for (T element : pq)
treeMap.put(i++, element);
return treeMap;
}
Run Code Online (Sandbox Code Playgroud)
优先队列 API:
iterator() 方法中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |