通过对象属性添加对象以进行设置和排序的有效方法。

时间:2014-03-03 15:07:17

标签: java hibernate

我正在尝试构建一个选择菜单对象。我正在使用hibernate标准来构建我的对象列表。我正在尝试将我的连接表对象添加到一个集合中以消除重复。然后,我想通过对象中的属性对该集进行排序,一旦有序,我需要将其添加到arraylist,最后在列表的末尾添加一个附加条目。

这是我到目前为止所拥有的。

public class Computer {

    private String name;

    //other properties getter/setter
}

选择菜单查询

public List<Computer> getComputerList() {
    //Hibernate critera query
    List<ComputerConfiguration> results = session.criteraQuery(ComputerConfiguration.class).add(Restrictions.eq("processor", "amd")).list();

    Set<Computer> computerSet = HashSet();

    //Get joined object and add to set to remove duplicates
    for(ComputerConfiguration computerConfiguration : results) {
        computerSet.add(computerConfiguration.getComputer());
    }

    List<Computer> computers = new ArrayList<>(computerSet);
    //Need to somehow order by computer.getName();

    //Lastly add the following
    computers.add("Other");

    //Return computers to select model
    return computers;
}

删除重复对象然后按属性名称排序的最有效方法是什么?我尝试了最初订购critera查询,但该集合似乎没有保持其位置。

感谢。

3 个答案:

答案 0 :(得分:2)

使用TreeSet对其中的元素进行排序。您可以在创建集时提供自定义Comparator

Set<Computer> computerSet = new TreeSet<Computer>(new Comparator<Computer>() {
    @Override
    public int compare(Computer computer1, Computer computer2) {
        //write the logic to define which computer is greater than the other...
    }
});

请注意,您的Computer课程不需要在equals内使用hashCodeTreeSet

答案 1 :(得分:1)

使用HashSet确保计算机是唯一的(就像您目前正在使用的那样)很好 - 假设您已正确实施hashCodeequals

为了按名称对List台计算机进行排序,您只需编写

即可
Collections.sort(computers, new Comparator<Computer>()
{
    @Override
    public int compare(Computer c0, Computer c1)
    {
        return c0.getName().compareTo(c1.getName());
    }
});

虽然使用TreeSet解决这个问题可能很诱人(因为它可以在一次运行中排序和删除重复项),但您应该仔细考虑您的比较标准是否与equals一致TreeSetComparator的JavaDoc中所述:

  

当且仅当c.compare(e1,e2)== 0具有与e1.equals(e2)相同的布尔值时,比较器c对一组元素S施加的排序被认为与equals一致。对于S中的每个e1和e2。

http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

这里的关键问题是:是否可以有两台名称相同的计算机(由getName()返回)但仍然被视为“相等”?

但是,如果排序标准与equals一致,则使用TreeSet与适当的比较器是可行的。

答案 2 :(得分:1)

您可以尝试使用SortedSet在填充集合时对计算机进行实际排序: SortedSet

另外,我不太了解你的行

computers.add("Other")

计算机是一个计算机对象ArrayList你可能无法正常工作。所以这是我的完整解决方案:

首先,使计算机对象具有可比性:

public class Computer implements Comparable<Computer> {

    private String name;

    public Computer (String name) { this.name = name; }

    public int compareTo(Computer c) {          
       return name.compareTo(c.name) ;          
   }
}

您现在可以使用这样的SortedSet:

public List<Computer> getComputerList() {
    List<ComputerConfiguration> results = session.criteraQuery(ComputerConfiguration.class).add(Restrictions.eq("processor", "amd")).list();

    SortedSet<Computer> computerSet = new TreeSet<>();
    for(ComputerConfiguration computerConfiguration : results) {
        computerSet.add(computerConfiguration.getComputer());
    }
    computerSet.add(new Computer("Other");

    List<Computer> computers = new ArrayList<>(computerSet);
    return computers;
}