0

I hope it is not repeating question,

I made two Classes, "Dog" and "Ser",

"Dog" Class uses a comparator to sort the price first. (Done correctly)
"Ser" Class should add sorted price list (as values) + (unrepeated country code as "Keys" in the map . which i have correctly to me.

In my information, Map should sort the keys in Ascending order explicitly, but this is not the case, see output.

My Goal is now to have sorted country code in the Class Ser with corresponding values of price

class Dog implements Comparator<Dog>, Comparable<Dog> {
    private int CountryCode;
    private double Price;
    private String Operator;

    Dog() {
    }

    Dog(int c, double p, String o) {
        CountryCode = c;
        Price = p;
        Operator = o;
    }

    public int getCountryCode() {
        return CountryCode;
    }

    public double getPrice() {
        return Price;
    }

    public String getOperator() {
        return Operator;
    }

    // Overriding the compareTo method
    public int compareTo(Dog d) {

        double de = Price - d.getPrice();

        if (de > 0.00001)
            return 1;
        if (de < 0.00001)
            return -1;
        return 0;

    }

    // Overriding the compare method to sort by price
    public int compare(Dog d, Dog d1) {

        double de = d.getPrice() - d1.getPrice();

        if (de > 0.00001)
            return 1;
        if (de < 0.00001)
            return -1;
        return 0;
    }

    @Override
    public String toString() {
        return "  " + Price + ":" + Operator + "";
    }

}

public class Ser {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // Takes a list o Dog objects

        ArrayList<Dog> list1 = new ArrayList<Dog>();
        Map<Integer, Dog> mp = new HashMap<Integer, Dog>();

        list1.add(new Dog(1, 0.9, "A"));
        list1.add(new Dog(268, 5.1, "A"));
        list1.add(new Dog(46, 0.17, "A"));
        list1.add(new Dog(4620, 0.0, "A"));
        list1.add(new Dog(468, 0.15, "A"));
        list1.add(new Dog(4631, 0.15, "A"));
        list1.add(new Dog(4673, 0.9, "A"));
        list1.add(new Dog(46732, 1.1, "A"));

        list1.add(new Dog(1, 0.92, "B"));
        list1.add(new Dog(44, 0.5, "B"));
        list1.add(new Dog(46, 0.02, "B"));
        list1.add(new Dog(467, 1.0, "B"));
        list1.add(new Dog(48, 1.2, "B"));

        list1.add(new Dog(1, 0.9, "c"));
        list1.add(new Dog(44, 0.4, "c"));
        list1.add(new Dog(46, 0.01, "c"));
        list1.add(new Dog(467, 0.2, "c"));

        // Sorts the array list using comparator

        Collections.sort(list1, new Dog());

        System.out.println("Sort the Dog class with respect to Price");

        for (Dog a : list1)
            // printing the sorted list of ages
            System.out.println(a.getCountryCode() + "  : " + a.getPrice()
                    + "  : " + a.getOperator());

        // Add only those keys from sorted Price but if the key is added, don't
        // repeat it
        for (int i = 0; i < list1.size(); i++) {
            if (!mp.containsKey(list1.get(i).getCountryCode()))
                mp.put(list1.get(i).getCountryCode(), list1.get(i));

        }

        System.out.println("");

        System.out.println(" Get Sorted List of Keys and values");

        for (Map.Entry<Integer, Dog> e : mp.entrySet()) {

            System.out.println(e.getKey() + "" + e.getValue());

        }

    }
}

Output: Sort the Dog class with respect to Price

4620  : 0.0  : A,  46  : 0.01  : c,  46  : 0.02  : B,  4631  : 0.15  : A,  468  : 0.15  : A,  46  : 0.17  : A,  467  : 0.2  : c,  44  : 0.4  : c,  44  : 0.5  : B,  1  : 0.9  : c,  4673  : 0.9  : A,  1  : 0.9  : A,  1  : 0.92  : B,  467  : 1.0  : B, 46732  : 1.1  : A, 48  : 1.2  : B, 268  : 5.1  : A

Get Sorted List of Keys and corresponding values

4673  0.9:A, 1  0.9:c, 46732  1.1:A, 48  1.2:B, 4631  0.15:A, 4620  0.0:A, 468  0.15:A, 46  0.01:c, 467  0.2:c, 268  5.1:A, 44  0.4:c
4

1 回答 1

4

这是问题所在:

Map <Integer, Dog> mp=  new HashMap  <Integer, Dog> ();

HashMap 不会将其元素排序为任何顺序。改用 TreeMap 试试。TreeMap 有一个带有 Comparator 的构造函数。

http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html

于 2013-01-25T10:20:43.107 回答