0

我有一个我称之为工件的对象列表。我需要按“名称”属性按字母顺序排序,并按工件称为“级别”的属性按数字顺序排序。

级别并不总是在 Artifact 中设置,在这种情况下,整个集合应该按字母顺序排列。如果 Artifact 有一个 Level,则优先级并应按 Level 的顺序排序。

Artifacts 需要基于 Name 属性是唯一的。我可以使用 Set 集合并覆盖 Artifact 的 equals 方法以按字母顺序排序。但是,当我想按 Level 排序时,与 Name 相关的 equals 方法会抛出这种排序的结果。

我应该使用什么集合和对象结构来保持名称的唯一性,但也能够按级别排序?

4

3 回答 3

2

您需要查看可比较接口比较器接口。如果这是可以比较对象的唯一方法,则实施 Comparable,否则实施比较器。

于 2012-05-17T23:09:59.190 回答
1

我认为这java.util.TreeSet是解决您问题的好容器。它是 Set 并且它使用 Compareble 机制。

所以你有两个选择:

1) 将 Comparator 放入 TreeSet 构造函数

2) 让你的 Artifact 实现 Comparable

提示:在 compareTo 方法中,您可以使用 String 中的 compareTo 方法。

于 2012-05-18T00:38:38.560 回答
0

下面的代码将对集合进行排序,优先考虑级别,然后是名称。如果一个级别为空,它将被放置在开头,将其视为级别 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()));
}

}
于 2012-05-18T00:21:10.130 回答