Rank
別のリストがループされているときにリストに追加されるオブジェクト ( ) があります。
これらの各オブジェクトには「up」および「down」プロパティがあり、それぞれ次の要素と前の要素に設定する必要があります。要素がリストの一番上にある場合、一番下の要素の場合と同様に、「up」プロパティはそれ自体を指す必要があります。
Vector ( java.util.Vector
) を使用しているので、インデックスを使用して次の要素と前の要素を見つけることができます。上下に操作する追加プロセスは次のとおりです。
public void addToRanksInOrderWithUpDown(Rank r) {
ranksInOrder.addElement(r);
if (ranksInOrder.size() != 1) {
Rank ru, rd;
try {
ru = ranksInOrder.elementAt(ranksInOrder.indexOf(r)+1);
} catch (ArrayIndexOutOfBoundsException e) {
ru = r;
}
try {
rd = ranksInOrder.elementAt(ranksInOrder.indexOf(r)-1);
} catch (ArrayIndexOutOfBoundsException e) {
rd = r;
}
r.setUp(ru);
r.setDown(rd);
ru.setDown(r);
rd.setUp(r);
}
}
r
渡された のインスタンスですRank
。ループは次のとおりです。
if (g.getRanksInOrder().size() == 1) {
g.addToRanksInOrder(currentRank);
} else {
g.addToRanksInOrderWithUpDown(currentRank);
}
addToRanksInOrder
の最初のステップを実行するだけaddToRanksInOrderWithUpDown
ですranksInOrder.addElement(r);
。
残念ながら、"up" と "down" は Null または間違ったものになることがよくあります。これについてもっと良い方法は何ですか?コードを修正できますか、それとも破棄する必要がありますか?
編集:申し訳ありませんが、実際に機能する答えはありません。問題は以前と同じままで、さまざまな浮き沈みがゼロまたは間違ったままです。
SSCCEは次のとおりです。
public class Rank {
private Rank up;
private Rank down;
private String name;
public Rank getUp() {
return up;
}
public Rank getDown() {
return down;
}
public Rank getName() {
return name;
}
public void setUp(Rank r) {
up = r;
}
public void setDown(Rank r) {
down = r;
}
public Rank(String s) {
name = s;
}
}
public class Ranker {
private Set<Rank> ranks = new HashSet<Rank>();
private Vector<Rank> ranksInOrder = new Vector<Rank>();
public Vector<Rank> sort() {
for (Rank r : ranks) {
if (ranksInOrder.size == 1) {
addToRanksInOrder(r);
} else {
addToRanksInOrderWithUpDown(r);
}
}
return ranksInOrder;
}
private void addToRanksInOrderWithUpDown(Rank r) {
ranksInOrder.addElement(r);
if (ranksInOrder.size() != 1) {
Rank ru, rd;
try {
ru = ranksInOrder.elementAt(ranksInOrder.indexOf(r)+1);
} catch (ArrayIndexOutOfBoundsException e) {
ru = r;
}
try {
rd = ranksInOrder.elementAt(ranksInOrder.indexOf(r)-1);
} catch (ArrayIndexOutOfBoundsException e) {
rd = r;
}
r.setUp(ru);
r.setDown(rd);
ru.setDown(r);
rd.setUp(r);
}
}
private void addToRanksInOrder(Rank r) {
ranksInOrder.addElement(r);
}
private String displayAsList(Vector<Rank> vr) {
String list = "";
for (Rank r : vr) {
list += "~" + r.getName() + "\n";
if (r.getUp() == null) {
list += " +NULL\n";
} else {
list += " +" + r.getUp().getName() + "\n";
}
if (r.getDown() == null) {
list += " -NULL\n";
} else {
list += " -" + r.getDown().getName() + "\n";
}
list += "----\n";
}
return list;
}
public static void main(String[] args) {
for (int i=0;i<11;i++) {
ranks.add(new Rank("Rank " + i));
}
System.out.println(displayAsList(sort()));
}
}