使用Comparable Interface比较多个属性

问题描述 投票:0回答:1

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

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

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

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

  1. BA经济学1
  2. BA经济学2
  3. BA经济学3
  4. 经济学学士4
  5. 经济学学士5
  6. BA经济学6
  7. BA英语1
  8. 英语学士2
  9. BA英语3
  10. 英语学士4
  11. 英语学士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();
        }
    }
}
java entity comparable
1个回答
1
投票

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

     Comparator.comparing(Classes::getName)
       .thenComparing(Classes::getSemester)
       ... other properties
© www.soinside.com 2019 - 2024. All rights reserved.