我有一个对象列表,我称之为工件。我需要按“名称”属性按字母顺序排序,并按照Artifact称为“级别”的属性按数字顺序排序。
在Artifact中并不总是设置Level,在这种情况下,整个集合应该是按字母顺序排列的。如果Artifact具有Level,那么它优先,并且应按Level的顺序排序。
基于Name属性,工件需要是唯一的。我可以使用Set集合并覆盖Artifact的equals方法按字母顺序排序。但是,当我想按级别排序时,与Name相关的equals方法将抛弃此类结果。
我应该使用哪些集合和对象结构按名称保持唯一,但也可以按级别排序?
答案 0 :(得分:2)
您需要查看comparable interface和comparator interface。如果这是比较对象的唯一方式,则实现Comparable,否则为比较器。
答案 1 :(得分:1)
我认为java.util.TreeSet
是您问题的好容器。它是Set,它使用Compareble机制。
所以你有两个选择:
1)将Comparator放入TreeSet构造函数
2)使你的神器实现可比较
提示:在compareTo方法中,您可以使用String中的compareTo方法。
答案 2 :(得分:0)
下面的代码将对该集合进行排序,该集合优先考虑该级别以及稍后的名称。如果一个级别为null,它将被置于开头,将其视为0级。对于null名称,Artifact将被定位为具有空级别。希望有所帮助。
import java.util.Arrays;
import java.util.SortedSet;
import java.util.TreeSet;
public class Artifact implements Comparable<Artifact> {
private String name;
private Integer level;
public Artifact(String name, Integer level) {
this.name = name;
this.level = level;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((level == null) ? 0 : level.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Artifact other = (Artifact) obj;
if (level == null) {
if (other.level != null)
return false;
} else if (!level.equals(other.level))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(Artifact o) {
if (level == null){
return new Artifact(name, 0).compareTo(o);
}
if (name == null){
return new Artifact("", level).compareTo(o);
}
if (level.equals(o.level)) {
return name.compareTo(o.name);
} else {
return level.compareTo(o.level);
}
}
public String toString() {
return level + " " + name;
}
public static void main(String[] args) {
Artifact a1 = new Artifact("a", 1);
Artifact a2 = new Artifact("a", 2);
Artifact a3 = new Artifact("a", 3);
Artifact b1 = new Artifact("b", 1);
Artifact b2 = new Artifact("b", 2);
Artifact b2a = new Artifact("b", 2);
Artifact nullLevel = new Artifact("a",null);
Artifact nullName = new Artifact(null,2);
SortedSet<Artifact> set = new TreeSet<Artifact>();
set.add(a1);
set.add(a2);
set.add(a3);
set.add(b1);
set.add(b2);
set.add(b2a);
set.add(nullLevel);
set.add(nullName);
System.out.println(Arrays.toString(set.toArray()));
}
}