0

アーティファクトと呼んでいるオブジェクトのリストがあります。「名前」属性でアルファベット順に並べ替え、Artifactが「レベル」と呼んでいる属性で番号順に並べ替える必要があります。

レベルは常にアーティファクトで設定されるとは限りません。その場合、コレクション全体がアルファベット順に設定されている必要があります。アーティファクトにレベルがある場合は、それが優先され、レベルの順序で並べ替える必要があります。

アーティファクトは、Name属性に基づいて一意である必要があります。Setコレクションを使用し、Artifactのequalsメソッドをオーバーライドして、アルファベット順に並べ替えることができます。ただし、レベルで並べ替える場合、Nameに関連するequalsメソッドは、この並べ替えの結果を破棄します。

名前で一意でありながら、レベルで並べ替えることができるようにするには、どのコレクションとオブジェクト構造を使用する必要がありますか?

4

3 に答える 3

2

比較可能なインターフェイスコンパレータインターフェイスを確認する必要があります。これがオブジェクトを比較できる唯一の方法である場合はComparableを実装し、そうでない場合はComparableを実装します。

于 2012-05-17T23:09:59.190 に答える
1

java.util.TreeSetはあなたの問題のための良いコンテナだと思います。Setであり、Comparebleメカニズムを使用しています。

したがって、2つのオプションがあります。

1)ComparatorをTreeSetコンストラクターに入れます

2)アーティファクトの実装を比較可能にする

ヒント:compareToメソッドでは、StringのcompareToメソッドを使用できます。

于 2012-05-18T00:38:38.560 に答える
0

以下のコードは、レベルに優先順位を付け、後で名前を付けてセットをソートします。レベルがnullの場合、最初に配置され、レベル0として扱われます。null名の場合、アーティファクトは空のレベルであるために配置されます。お役に立てば幸いです。

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 に答える