【问题标题】:Different collections for different data sorting不同的集合用于不同的数据排序
【发布时间】:2011-04-29 21:38:28
【问题描述】:

我有一个任务是使用 Java Collections 框架。我需要从数据库中获取用户列表,并将其存储在集合中。 (这就完成了,用户存储在一个 HashSet 中)。每个用户都是 Person 类的一个实例,用姓名、姓氏、出生日期、加入日期和其他一些现在不重要的参数来描述。接下来,我需要将列表存储在不同的集合中(没有说明有多少),提供按以下方式对它们进行排序的功能:
- 仅限姓名
- 姓名、姓氏、生日
- 加入日期

好的,首先,我的 Person 仅将数据存储为字符串(我应该将日期更改为 Date 吗?)。我已经开始使用“按姓名、姓氏、生日”进行排序,因为这就是我在使用字符串在列表中调用sort 后得到的结果。我说的对吗?

public List createListByName(Set set){
    List ret = new ArrayList<String>();
    String data = "";

    for(Object p: set){
        data = p + "\n";
        ret.add(data);
    }
    Collections.sort(ret);
    return ret;
}

但是剩下的呢?这是我的Person

class Person {

    private String firstname;
    private String lastname;
    )..)


    Person(String name, String surname, (..)){
        firstname = name;
        lastname = surname;
        (..)
    }

    @Override
    public String toString(){
        return firstname + " " + lastname + " " + (..);
    }
}

【问题讨论】:

    标签: java sorting collections jquery-ui-sortable


    【解决方案1】:

    我不会一开始就将所有内容都转换为字符串。我会实现Comparator&lt;Person&gt;,然后对List&lt;Person&gt;进行排序:

    public List<Person> createListByName(Set<Person> set){
        List<Person> ret = new ArrayList<Person>(set);
        Collections.sort(ret, new NameSurnameBirthComparator());
        return ret;
    }
    

    NameSurnameBirthComparator 将实现 Comparator&lt;Person&gt; 并通过首先比较他们的名字,然后是他们的姓氏(如果他们的名字相同)然后是他们的出生日期(如果他们的姓氏相同)来比较两个人。

    类似这样的:

    public int compare(Person p1, Person p2) {
        // TODO: Consider null checks, and what to do :)
        int firstNameResult = p1.getFirstName().compareTo(p2.getFirstName());
        if (firstNameResult != 0) {
            return firstNameResult;
        }
        int surnameResult = p1.getSurname().compareTo(p2.getSurname());
        if (surnameResult != 0) {
            return surnameResult;
        }
        return p1.getBirthDate().compareTo(p2.getBirthDate());
    }
    

    是的,我将出生日期存储为Date - 或者最好存储为JodaTime 中的LocalDate,因为这是一个更好的日期和时间操作库: )

    【讨论】:

    • 所以我应该为每个任务在 Person 上写多个比较器?
    • @owca 是的。如果您想要 3 个列表(或集合),每个列表(或集合)的排序不同,您可以为每个排序编写一个比较器。
    • @owca:您可以为每个整体排序顺序编写一个比较器,或者为每个属性编写一个比较器,然后使用一个实用程序类来组合两个比较器以创建一个新的比较器。
    【解决方案2】:

    所以我应该为每个任务在 Person 上写多个比较器?

    鉴于这是一项家庭作业,那么我会说这是您开始学习比较器的方式。

    仅出于兴趣考虑,您可以通过创建几个可重复使用的比较器来做到这一点。

    您可以使用Bean Comparator 对各个属性进行排序。

    然后您可以使用Group Comparator 对多个属性进行排序。

    【讨论】:

    • 是的,我从未使用过它们,所以我现在正在浏览文档。乍一看,我确信 Comparator 是一个实现 Comparable 的对象:P
    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-12-08
    相关资源
    最近更新 更多