我有以下方法:
public final NavigableSet<AnimalCard> getCowTradeCardsSorted() {
TreeMap<AnimalCard,AnimalCard> ssa = new TreeMap<AnimalCard,AnimalCard>();
Iterator<E> i = this.cowTradeCards.iterator();
System.out.println("Input is:"+this.cowTradeCards.toString());
while (i.hasNext()) {
E a = i.next();
System.out.println("Adding 2 ssa:"+a.toString());
ssa.put((AnimalCard) a ,(AnimalCard) a); //this.getCountOfOneCard(a));
System.out.println("ssa is now"+ssa.toString());
}
System.out.println("returnvalue is"+ ssa.descendingKeySet().toString());
return ssa.descendingKeySet().descendingSet();
}
我希望以下输出为returnvalue:[1000,500,160,10]
但我得到[1000]
这是输出fom控制台:
Input is:[1000, 10, 160, 500]
Adding 2 ssa:1000
ssa is now{1000=1000}
Adding 2 ssa:10
ssa is now{1000=10}
Adding 2 ssa:160
ssa is now{1000=160}
Adding 2 ssa:500
ssa is now{1000=500}
returnvalue is[1000]
有什么不对?看起来树图是将所有值绑定到第一个键吗?
ps:this.cowtradecards是一个arraylist但实际上并不重要
public class AnimalCard extends Card { ..........
// super has this :public int getValue() {
// return this.value;
// }
@Override
public int compareTo(Object o) {
// Pufferelement vom Typ AnimalCard
AnimalCard buffer;
// Kontrolle, ob übergebenes Objekt vom Typ "AnimalCard" ist
if (o instanceof MoneyCard) { <--------------- here is the error !!!!! should be AnimalCard !
// wenn ja, dann Typcasting vornehmen
buffer = (AnimalCard) o;
if (super.getValue() < buffer.getValue()) {
return -1;
}
if (super.getValue() > buffer.getValue()) {
return 1;
}
return 0;
} else {
// not an "AnimalCard"
}
return 0;
}
after i fixed the compareto:
Input is:[1000, 10, 160, 500]
Adding 2 ssa:1000
ssa is now{1000=1000}
Adding 2 ssa:10
ssa is now{10=10, 1000=1000}
Adding 2 ssa:160
ssa is now{10=10, 160=160, 1000=1000}
Adding 2 ssa:500
ssa is now{10=10, 160=160, 500=500, 1000=1000}
returnvalue is[1000, 500, 160, 10]
答案 0 :(得分:2)
问题可能与compareTo
中的AnimalCard
有关。检查compareTo
是否正在执行您期望的操作,并且根据此方法,具有不同数字的两个AnimalCard
实例不被视为相等(即在这种情况下它不会返回0
)。如果是,那么这将解释您的结果,因为TreeMap
只会更新预先存在的条目而不是添加新条目。
此外,如果您正在调试,则可能需要打印put()
的返回值(它可以让您了解正在发生的事情)。
答案 1 :(得分:1)
你的toString
方法说“ssa现在是{1000 = 1000}”而“ssa现在是{1000 = 160}” - 很可能,无论出于什么原因,它们似乎都有1000个他们都是。我会在compareTo
上查看您的AnimalCard
方法,以获取更多线索。
答案 2 :(得分:0)
根据您的方法名称,您希望对ArrayList进行排序(并删除重复项)。如果AnimalCard实现了Comarable,这应该像
一样简单return new TreeSet<AnimalCard>(cowTradeCards);
答案 3 :(得分:0)
正如其他人一直在说的那样,compareTo()
的实施方式不正确/不完整,导致您遇到的问题。
public int compareTo(Object o) {
// Pufferelement vom Typ AnimalCard
AnimalCard buffer;
// Kontrolle, ob übergebenes Objekt vom Typ "AnimalCard" ist
if (o instanceof MoneyCard) { <--------------- here is the error !!!!! should be AnimalCard !
// Lots of really interesting logic that's never going to get run because o instanceof AnimalCard, not Moneycard.
} else {
// We're always going to come here, but we're not going to do anything, so we'll fall through...
}
// And now we'll return a value saying that the two objects are equal. ALWAYS.
return 0;
}
你的比较器说所有的AnimalCards都是相同的。您的TreeMap会像您期望的那样添加第一个(1000)。当谈到第二个时,它会识别出它与第一个相同,所以它保持键的原样,但将新的AnimalCard放入值中。 (为什么,我不确定,但它并不重要。)当我们插入第三个时,同样的事情发生:第一个对象保留为键,第三个对象替换第二个作为值。所以在将它们全部插入之后,你会留下一个带有单个条目的地图,其中一个键等于第一个,而一个值等于第二个。
击败死马:修复你的compareTo()
。你会解决你的问题。
顺便提一下,您发布的示例代码不需要TreeMap;如果您使用该值作为键,您真正想要的可能是Treeset。