当另一个列表循环通过时,我有一些对象(Rank
s)被添加到列表中。
这些对象中的每一个都有一个“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()));
}
}