0

我有以下方法:

     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();
}

我希望以下输出作为返回值:[1000,500,160,10]

但我得到 [1000]

这是控制台的输出:

   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 是一个数组列表,但这并不重要

    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]
4

4 回答 4

2

问题可能与compareToin 有关AnimalCard。检查它compareTo正在做您期望它做的事情,并且AnimalCard基于此方法,具有不同数字的两个实例不被视为相等(即在这种情况下它不会返回0)。如果是,那么这将解释您的结果,因为TreeMap只会更新预先存在的条目而不是添加新条目。

此外,如果您正在调试,您可能想要打印的返回值put()(它可以让您了解正在发生的事情)。

于 2013-07-31T22:07:30.227 回答
1

您的toString方法是说“ssa is now{1000=1000}”和“ssa is now{1000=160}”——因此,无论出于何种原因,它们似乎都有 1000 个。我会查看您的compareTo方法以AnimalCard获取更多线索。

于 2013-07-31T22:07:59.673 回答
0

根据您的方法名称,您希望对 ArrayList 进行排序(并删除重复项)。如果 AnimalCard 实现了 Comarable,这应该很简单

return new TreeSet<AnimalCard>(cowTradeCards);
于 2013-07-31T22:13:02.907 回答
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 放入 value。(为什么,我不确定,但这并不重要。)当我们插入第三个对象时,会发生同样的事情:第一个对象保留为键,第三个对象替换第二个对象作为值。因此,在将它们全部插入之后,您将得到一个带有单个条目的映射,其键等于第一个条目,值等于第二个条目。

打败一匹死马:修复你的compareTo(). 你会解决你的问题。

顺便说一句,您发布的示例代码不需要 TreeMap;如果您使用该值作为键,那么您真正想要的可能是Treeset

于 2013-07-31T22:53:50.827 回答