0

以下はコンパレータのコードですが、SortedMap.putAll()の後、SortedMapのマップエントリの数はソースマップと比較して少なくなっています。

誰か助けてもらえますか?

Comparator<ArrayList> arrayListComparer = new Comparator<ArrayList>() {
                @Override
                public int compare(ArrayList arrA, ArrayList arrB) {
                    DateFormat formatter = new SimpleDateFormat("MMM-yyyy");
                    Date dateA = new Date();
                    Date dateB = new Date();
                    try {
                        dateA = formatter.parse(arrA.get(0).toString());
                        dateB = formatter.parse(arrB.get(0).toString());
                    } catch (ParseException ex) {
                        Logger.getLogger(ValueComparator.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    if (dateA.before(dateB)) {
                        return 0;
                    } else if (dateA.after(dateB)) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
            };
SortedMap sorted_map = new TreeMap(arrayListComparer);
sorted_map.putAll(map);
4

2 に答える 2

0

あなたの地図の例を見せていただければ助かりますが、とにかく答えを危険にさらします。

おそらくこれを引き起こしているのは、compareメソッド(コンパレータ内)が0を返すエントリがマップにあることです。これは、キーが等しいことを意味します。それらが等しい場合、それは同じキーです...そしてマップに重複するキーを持つことはできません。

問題がわかりますか?

少し例を挙げましょう:

public static void main(String[] args) {
    Map<Bla, String> map = new HashMap<Bla, String>();
    map.put(new Bla(1,1), "bla1");
    map.put(new Bla(1,2), "bla2");
    map.put(new Bla(1,3), "bla3");

    System.out.println(map.size());

    TreeMap<Bla, String> treeMap = new TreeMap<Bla,String>(new Comparator<Bla>() {
        @Override
        public int compare(Bla bla, Bla bla1) {
            return new Integer(bla.a).compareTo(bla1.a);
        }
    });

    treeMap.putAll(map);

    System.out.println(treeMap.size());

}

private static class Bla{

    private Bla(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public int a;
    public int b;
}

これは出力します

3 1

私のコンパレータは、3つのキーすべてが同じであると言っているためです(「a」値を比較するだけです)。

于 2012-04-23T18:06:29.863 に答える
0

を使用している場合、SortedMapまたは2つのオブジェクトが等しい場合にのみ0を返す必要がありますSortedSetComparatorそれはこの基準によって鍵の平等を扱うからです。

自然順序付けを参照してください:http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

たとえば、明示的なコンパレータを使用しないソートされたセットに(!a.equals(b)&& a.compareTo(b)== 0)となる2つのキーaとbを追加すると、2番目の追加操作はfalseを返します。 (そして、ソートされたセットのサイズは増加しません)aとbは、ソートされたセットの観点からは同等であるためです。

于 2012-04-23T18:10:29.903 に答える