我正在尝试构建一个选择菜单对象。我正在使用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查询,但该集合似乎没有保持其位置。
感谢。
答案 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
内使用hashCode
或TreeSet
。
答案 1 :(得分:1)
使用HashSet
确保计算机是唯一的(就像您目前正在使用的那样)很好 - 假设您已正确实施hashCode
和equals
。
为了按名称对List
台计算机进行排序,您只需编写
Collections.sort(computers, new Comparator<Computer>()
{
@Override
public int compare(Computer c0, Computer c1)
{
return c0.getName().compareTo(c1.getName());
}
});
虽然使用TreeSet
解决这个问题可能很诱人(因为它可以在一次运行中排序和删除重复项),但您应该仔细考虑您的比较标准是否与equals一致如TreeSet
和Comparator
的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;
}