我最近开始学习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;
}
}
我确实了解它们之间的其他差异。但是我有点停留在这种差异上(单项和多项排序标准)。 如果我错了,请纠正我。如果可以使用上述方法,为什么对单个排序标准建议使用可比性?有人可以举例说明一下吗?谢谢!
答案 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_())
用于单一排序标准?
没有普遍接受的建议。
无论您在哪里阅读,都错了。
Comparable
与Comparator
根本不是要比较一个还是多个值。
一个对象最多可以具有一个自然顺序。如果是这样,则使用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)
相同。