java - 我的类似界面逻辑有什么问题?
问题描述
所以问题如下
为每个进入队列的学生分配一个唯一的 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 的确切顺序复制到列表中。
解决方案
比较器的一般结构应该是:比较一个字段;如果字段值不同,则返回;如果它们相同,则进入下一个字段。
在这种情况下,它可能看起来像:
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;
(最后一个if
andreturn
可以折叠为 just return cmp;
;但我认为如果您按照上述方式进行操作,以后扩展会更容易,因为您可以插入另一个cmp/if
.)
推荐阅读
- excel - 有没有办法根据另外两列输出一列中的值?
- tableau-api - 如何创建使用 Tableau 中选择的筛选项数量的计算字段?
- python - 如何使用 Selenium 和 Python 查找此示例的元素
- tfs - TFS 2017 如何删除构建?
- xamarin - 如何在 Xamarin 中使用 RotateDrawable?
- c# - 我不能打开对话框最重要?
- excel - 如何将单元格更改为货币
- jquery - 如何调整我从演示站点获取的这个轮播的大小?
- java - java.io.ioexception:读取失败,套接字可能关闭或超时 Java Android Studio
- google-cloud-dataflow - 用于流式传输的 Google Cloud Dataflow,dataflow 何时会自动关闭并清理 VM 实例?