Java分类对象使用Comparable并具有多个分类标准

时间:2019-02-21 01:49:10

标签: java comparator comparable

我最近开始学习Java。我在看可比和比较器。我读到的区别之一是“当您有一个排序标准时,使用可比较的接口,并且不止一个使用Comparator”。 但是对于可比,我可以使用多个排序标准,如下所示:

class Employee implements Comparable<Employee>{
    public int empID;
    public int empStartDate;

    public int compareTo(Employee empObj){
        int result = this.empID - empObj.empID;
        if(result == 0){
            result = this.empStartDate - empObj.empStartDate;
        }
        return result;
    }
}

我确实了解它们之间的其他差异。但是我有点停留在这种差异上(单项和多项排序标准)。 如果我错了,请纠正我。如果可以使用上述方法,为什么对单个排序标准建议使用可比性?有人可以举例说明一下吗?谢谢!

1 个答案:

答案 0 :(得分:1)

  

如果我们可以使用上述方法,为什么建议将from PyQt4 import QtCore, QtGui from PyQt4.QtCore import * from PyQt4.QtGui import * import threading import sys import Sybase def logthread(caller): print('%-25s: %s, %s,' % (caller, threading.current_thread().name, threading.current_thread().ident)) class testTool(QWidget): def __init__(self): super(testTool, self).__init__() self.verticalLayout = QtGui.QVBoxLayout() self.searchq = QtGui.QLineEdit() self.model = QtGui.QStandardItemModel() logthread('mainwin_before_thread.__init__') self.sqlThread() logthread('mainwin_after_thread.__init__') self.filter_proxy_model = QtGui.QSortFilterProxyModel() self.filter_proxy_model.setSourceModel(self.model) self.searchq.textChanged.connect(self.filter_proxy_model.setFilterRegExp) self.verticalLayout.addWidget(self.searchq) self.tableWidget = QListView() self.tableWidget.setModel(self.filter_proxy_model) self.verticalLayout.addWidget(self.tableWidget) self.setLayout(self.verticalLayout) logthread('mainwin_end.__init__') def sqlThread(self): self.my_thread = QThread() self.my_thread.start() self.my_worker = GenericWorker(self.sql) self.my_worker.moveToThread(self.my_thread) self.my_worker.start.emit() def sql(self): logthread('mainwin.sql') self.db = Sybase.connect('') self.c = self.db.cursor() #a long queryyy self.c.execute( '''''') self.list = self.c.fetchall() self.all_user = [] for user in self.list: self.all_user.append(user[0]) self.list = self.all_user for self.text in self.list: self.item = QtGui.QStandardItem(self.text) self.model.appendRow(self.item) logthread('mainwin.sql_end.__init__') class GenericWorker(QObject): start = pyqtSignal() finished = pyqtSignal() def __init__(self, function, *args, **kwargs): super(GenericWorker, self).__init__() logthread('GenericWorker.__init__') self.function = function self.args = args self.kwargs = kwargs self.start.connect(self.run) @pyqtSlot() def run(self, *args, **kwargs): logthread('GenericWorker.run') self.function(*self.args, **self.kwargs) self.finished.emit() app = QApplication(sys.argv) ex = testTool() ex.show() sys.exit(app.exec_()) 用于单一排序标准?

没有普遍接受的建议。

无论您在哪里阅读,都错了。


ComparableComparator根本不是要比较一个还是多个值。

一个对象最多可以具有一个自然顺序。如果是这样,则使用mainwin_before_thread.__init__: MainThread, 19824, GenericWorker.__init__ : MainThread, 19824, mainwin_after_thread.__init__: MainThread, 19824, GenericWorker.run : Dummy-1, 7020, mainwin.sql : Dummy-1, 7020, *here is the delay that freezes the GUI init for 3-4 seconds while the sql query processes.. * mainwin_end.__init__ : MainThread, 19824, mainwin.sql_end.__init__ : Dummy-1, 7020, 实现该自然顺序。它实际上是用Comparable的Javadoc编写的:

  

此接口对实现该接口的每个类的对象强加了总体排序。此排序称为类的自然排序,而类的Comparable方法称为其自然比较方法

对象是否具有自然顺序,都可以使用Comparable来实现(替代)顺序。

完成比较的复杂性也没有。


无关:

请勿使用整数减法来计算compareTo / Comparator的结果,因为如果两个值相差超过compare(数字溢出),它将失败。

比较compareTo值时始终使用Integer.compare(x, y)(自Java 7开始可用)。与Long.compare​(x, y)相同。