用对象排序列表?

时间:2015-01-11 22:53:55

标签: java sorting

在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());
}

如何进行排序?请帮忙

3 个答案:

答案 0 :(得分:1)

而不是JList<String>,请创建JList<contacts>

实现类ContactsRenderer扩展JLabel实现ListCellRenderer。 有关详细信息,请参阅java doc: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()

答案 1 :(得分:0)

在java中,您可以对列表进行排序:

Collections.sort(yourListOfContacts, new Comparator<Contacts>(){

    @Override
    public int compare(Contacts obj1, Contacts obj2){
       obj1.getFirstName().compareTo(obj2.getFirstName());
    }

});

请注意,compare函数的返回类型是整数。这个整数告诉排序算法两者中的哪一个应该首先出现。请注意,-1表示第一个元素是&#34; less&#34;比第二个,0表示它们是相同的,而1表示第一个元素是&#34;更大&#34;比第二个。因此,要颠倒顺序,您可以使用:obj2.getFirstName().compareTo(obj1.getFirstName());或者,您可以乘以-1

您要排序的其他字段将遵循相同的模式,这只是一个示例。

答案 2 :(得分:0)

在Java8中,您可以按如下方式对列表进行排序:

Collections.sort(contactList, (contact1, contact2) 
    -> contact1.getName().compareTo(contact2.getName()));