首页 > 解决方案 > 我的类似界面逻辑有什么问题?

问题描述

所以问题如下

为每个进入队列的学生分配一个唯一的 ID。队列根据以下标准(优先标准)为学生服务:

首先为具有最高累积平均绩点 (CGPA) 的学生提供服务。

任何拥有相同 CGPA 的学生将按姓名升序(区分大小写字母顺序)提供服务。

任何具有相同CGPA和姓名的学生将按id升序排列

我的代码

class Priorities{
    public List<Students> getStudents(List<String> events) {
            PriorityQueue<Students> pq = new PriorityQueue<Students>();
            for ( String s : events) {
                if ( s.contains("ENTER")) {
                    String [] arr = s.split(" ");
                    int id = Integer.parseInt(arr[3]);
                    String name = arr[1];
                    Double cgpa = Double.parseDouble(arr[2]);       
                    pq.add(new Students(id, name, cgpa));
                }
                else
                    pq.poll();
            
            }
            List<Students> studentList = new ArrayList<Students>(pq);
    
            return studentList;
        }
        
        
        
    }
    
class Students implements Comparable<Students>{
    
    int id;
    String name;
    double cgpa;
    
    public Students(int id, String name, double cgpa) {
        this.id = id;
        this.name = name;
        this.cgpa = cgpa;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getCgpa() {
        return cgpa;
    }

    public void setCgpa(double cgpa) {
        this.cgpa = cgpa;
    }
        // -1 return left, 1 return right
    public int compareTo(Students other) {
    if ( this.equals(other))
        return 0;
    else if ( this.getCgpa() > other.getCgpa())
        return -1;
    else if ( this.getCgpa() < other.getCgpa())
        return 1;
    else if ( this.getCgpa() == other.getCgpa() && this.getName().compareTo(other.getName()) == 0)
        return Integer.compare(this.getId(), other.getId());
    else 
        return this.getName().compareTo(other.getName());
    
        
}
}

样本输入

12
ENTER John 3.75 50
ENTER Mark 3.8 24
ENTER Shafaet 3.7 35
SERVED
SERVED
ENTER Samiha 3.85 36
SERVED
ENTER Ashley 3.9 42
ENTER Maria 3.6 46
ENTER Anik 3.95 49
ENTER Dan 3.95 50
SERVED

样本输出

Dan
Ashley
Shafaet
Maria

我得到以下

Dan
Ashley
Maria
Shafaet

编辑:使用

List<Students> studentList = new ArrayList<Students>();
        while(!pq.isEmpty())
        {
            studentList.add(pq.poll());
        }

而不是 List studentList = new ArrayList(pq); 有助于将 PQ 的确切顺序复制到列表中。

标签: javadata-structurespriority-queuecomparable

解决方案


比较器的一般结构应该是:比较一个字段;如果字段值不同,则返回;如果它们相同,则进入下一个字段。

在这种情况下,它可能看起来像:

int cmp;

cmp = Double.compare(other.getCgpa(), this.getCgpa());
if (cmp != 0) return cmp;

cmp = this.getName().compareTo(other.getName());
if (cmp != 0) return cmp;

cmp = Integer.compare(this.getId(), other.getId());
if (cmp != 0) return cmp;

return 0;

(最后一个ifandreturn可以折叠为 just return cmp;;但我认为如果您按照上述方式进行操作,以后扩展会更容易,因为您可以插入另一个cmp/if.)


推荐阅读