首先,在这篇文章中,我不是在问一个问题。我发布这个是因为我需要你身边的建议。
我在Struts MVC工作,这是我的要求: -
有一个类入口页面,用户可以在该页面中为学生添加,编辑和删除课程。因此,在上述三个过程之后,当刷新页面时,表中存在的数据应显示在页面区域的其余部分中。该列表将显示SlNo。,课程名称,学期,班级名称,班级代码等。
我正在使用TO类来显示页面中的现有数据。之前,列表是根据课程名称排序的[TO是可比较类型,比较机制基于课程名称]。现在他们想要根据课程名称和学期编号进行排序,这意味着列表应该是这样的
所以最初我改变了mysql查询按课程名称,学期命令。然后我更改了TO类,使其没有内置的比较机制。代码工作正常。
但是经过一段时间我得到了另一个想法,我尝试使用Comparable接口实现相同的机制,在comapreTo
方法中我采用了当前引用的课程名称和学期的哈希码并添加了它们,然后我做了同样的事情comapreTo
方法的参数参考和我取了两个答案的差异并将其返回。令人惊讶的是它有效,但我不确定这是否适用于所有情况。这是满足要求的好方法吗?这是一种很好的编程方式吗?
示例代码: -
package com.sample;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
class Classes implements Comparable<Classes> {
private String name;
private int semester;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSemester() {
return semester;
}
public void setSemester(int semester) {
this.semester = semester;
}
public Classes(String name, int semester) {
super();
this.name = name;
this.semester = semester;
}
public int compareTo(Classes other) {
return (this.name.hashCode() + new Integer(this.semester).hashCode()) -
(other.name.hashCode() + new Integer(other.semester).hashCode());
}
}
public class ComparableMultipleAttributes {
public static void main(String[] args) {
List<Classes> classList = new ArrayList<Classes>();
classList.add(new Classes("BA English", 1));
classList.add(new Classes("BA Economics", 3));
classList.add(new Classes("BA Economics", 1));
classList.add(new Classes("BA English", 6));
classList.add(new Classes("BA English", 5));
classList.add(new Classes("BA Economics", 2));
classList.add(new Classes("BA Economics", 5));
classList.add(new Classes("BA English", 4));
classList.add(new Classes("BA Economics", 4));
classList.add(new Classes("BA English", 3));
classList.add(new Classes("BA Economics", 6));
classList.add(new Classes("BA English", 2));
Collections.sort(classList);
Iterator<Classes> it = classList.iterator();
while(it.hasNext()) {
Classes c = it.next();
System.out.println(c.getName() + "---" + c.getSemester());
System.out.println();
}
}
}
除了你得到的好评之外,如果你真的想要一个比较器按多个属性排序,那么使用jdk-8很容易实现:
Comparator.comparing(Classes::getName)
.thenComparing(Classes::getSemester)
... other properties