使用Comparable Interface

时间:2017-04-04 09:17:10

标签: java entity comparable

首先,在这篇文章中,我没有提出问题。我发布此信息是因为我需要您的建议。

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

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

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

  1. BA Economic 1
  2. BA Economic 2
  3. BA Economic 3
  4. BA Economic 4
  5. BA Economic 5
  6. BA Economic 6
  7. BA English 1
  8. BA English 2
  9. BA English 3
  10. BA English 4
  11. BA English 5
  12. BA English 6
  13. 所以最初我改变了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();
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

除了你得到的好评之外,如果确实希望比较器按多个属性排序,那么使用jdk-8很容易实现:

     Comparator.comparing(Classes::getName)
       .thenComparing(Classes::getSemester)
       ... other properties