繁体   English   中英

用对象排序列表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM