使用可比较接口映射多个属性



首先,在这篇文章中,我不是在问一个问题。我发布这个是因为我需要你的建议。

我在Struts MVC工作,这是我的要求:-

有一个用于类条目的页面,用户可以在其中为大学的学生添加、编辑和删除课程。因此,在上述三个过程之后,当页面刷新时,表中存在的数据应显示在页面区域的其余部分。该列表将显示SlNo.课程名称,学期,班级名称,班级代码

我正在使用TO类来显示页面中的现有数据。早些时候,列表是根据课程名称排序的[TO是可比较类型,比较机制是基于课程名称]。现在他们想要根据课程名称和学期编号进行排序,这意味着列表应该像

  1. BA 经济 1
  2. BA 经济 2
  3. BA 经济 3
  4. BA 经济 4
  5. BA 经济 5
  6. BA 经济 6
  7. BA 英语 1
  8. BA 英语 2
  9. BA 英语 3
  10. BA 英语 4
  11. BA 英语 5
  12. BA 英语 6

所以最初我更改了 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

最新更新