[英]Sorting a list with objects?
在contacts类(实现actionListener)中,我有一个JList,其中包含对象(文件中的元素)。 有排序按钮,每个按钮都有一个actionListener
按名字
按姓氏
按城市
排序是通过对象的元素完成的。
用户应提供联系人的名字和姓氏以及城市。 怎么做排序?
并将这些放入列表中,我使用了以下代码:
Map<String, contacts> ma = readFromFile();
for (Map.Entry<String, contacts> entry : ma.entrySet()) {
contacts c = (contacts) entry.getValue();
d.addElement(c.getLastName() + "" + c.getFirstName() + "" + c.getCity());
}
怎么做排序? 请帮助
代替JList<String>
,创建一个JList<contacts>
实现类ContactsRenderer扩展JLabel实现ListCellRenderer。 有关更多详细信息,请参见Java文档: http : //docs.oracle.com/javase/7/docs/api/javax/swing/JList.html
实现您的自定义列表数据模型:
public class ContactsModel extends AbstractListModel<contacts>() {
private final List<contacts> backingList = ArrayList<contacts>;
public ContactsModel(Map<String, contacts> ma) {
//populate backing list here from your map
}
public int getSize() {
return backingList.size();
}
public contacts getElementAt(int index) {
return backingList.get(index);
}
};
向模型添加排序方法:
public void sort(Comparator<contacts> comparator) {
Collections.sort(backingList, comparator);
fireContentsChanged(this, 0, backingList.size());
}
为每种用例实现比较器:
public class LastNameAscendingComparator implements Comparator<contacts> {
@Override
public int compare(contacts c1, contacts c2){
return c1.getLastName().compareTo(c2.getLastName());
}
}
最后,使用相应的比较器调用model.sort()
在Java中,您可以像这样对列表进行排序:
Collections.sort(yourListOfContacts, new Comparator<Contacts>(){
@Override
public int compare(Contacts obj1, Contacts obj2){
obj1.getFirstName().compareTo(obj2.getFirstName());
}
});
请注意,比较函数的返回类型是整数。 该整数告诉排序算法应该首先使用两者中的哪一个。 请注意, -1
表示第一个元素“小于”第二个元素, 0
表示它们相同,而1
表示第一个元素“大于”第二个元素。 因此,要颠倒顺序,可以使用: obj2.getFirstName().compareTo(obj1.getFirstName());
或者,您可以乘以-1
。
您要排序的其他字段将遵循相同的模式,这只是一个示例。
在Java8中,您可以像这样对列表进行排序:
Collections.sort(contactList, (contact1, contact2)
-> contact1.getName().compareTo(contact2.getName()));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.