如何使用比较器对重复的字符串进行排序?

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)

Evg*_*eev 2

优先队列 API:

iterator() 方法中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。