inverse sort on key?

Discussion in 'Java' started by nooneinparticular314159@yahoo.com, Aug 5, 2008.

  1. Guest

    I have an object (say, Car). Car contains some values, one of which
    is speed. I want to store lots of cars in some sort of object that
    will keep them sorted by speed. Some cars may have the same speed.
    The catch is that I want to sort by highest speed, not lowest speed.
    If I insert lots of cars into a TreeSet, with the key being the speed,
    I get them in increasing order. If there are n cars with the same
    speed, I get only one, because the keys are identical. I've been
    unable to find an object that would work. I've tried implementing a
    compare method in my object, and that doesn't help either. Any ideas?

    To summarize, the container object must:
    1) Support sorting in inverse order (or another order of my choice)
    2) Keep the objects sorted.
    3) Support duplicate objects.

    (I suppose I could sort on the negative value of the sort key, but...)

    Thanks!
    , Aug 5, 2008
    #1
    1. Advertising

  2. On 05/08/2008 20:22, allegedly wrote:
    > I have an object (say, Car). Car contains some values, one of which
    > is speed. I want to store lots of cars in some sort of object that
    > will keep them sorted by speed. Some cars may have the same speed.
    > The catch is that I want to sort by highest speed, not lowest speed.
    > If I insert lots of cars into a TreeSet, with the key being the speed,
    > I get them in increasing order. If there are n cars with the same
    > speed, I get only one, because the keys are identical. I've been
    > unable to find an object that would work. I've tried implementing a
    > compare method in my object, and that doesn't help either. Any ideas?
    >
    > To summarize, the container object must:
    > 1) Support sorting in inverse order (or another order of my choice)
    > 2) Keep the objects sorted.


    Specify a proper Comparator. A TreeSet should do just fine. See example
    code below.

    > 3) Support duplicate objects.


    I quite certain that's not a problem of order (Comparable/Comparator),
    but rather one of _equality_. Do you override equals() in that class?
    Does the overridden method specify that two Cars are equal if their
    speeds are equal? If yes, there's your problem. If not, I think it's
    somewhere in the vicinity.



    <code what_about_the_javadoc="shrug">
    public class InverseComparator<E>
    implements Comparator<E>
    {
    private Comparator<E>
    backingComparator
    ;

    public InverseComparator(){
    }

    public InverseComparator(Comparator<E> normalorder){
    backingComparator = normalorder;
    }

    public int compare(E o1, E o2) {
    if( backingComparator != null ){
    return - backingComparator.compare(o1, o2);
    }
    else{
    if( ! (o1 instanceof Comparable) ){
    throw new IllegalArgumentException("No normal order
    Comparator specified -- Objects must implement Comparable");
    }

    return - ((Comparable)o1).compareTo(o2);
    }
    }



    public static void main(String[] ss){
    List<Car> cars = Arrays.asList( new Car[]{ new Car(2),new
    Car(3),new Car(5),new Car(7),new Car(11) } );

    List<Car> cars1 = new ArrayList<Car>(cars);
    List<Car> cars2 = new ArrayList<Car>(cars);
    List<Car> cars3 = new ArrayList<Car>(cars);
    List<Car> cars4 = new ArrayList<Car>(cars);

    Collections.sort(cars1);
    Collections.sort(cars2, new InverseComparator<Car>());
    Collections.sort(cars3, new NormalOrderCarComparator());
    Collections.sort(cars4, new InverseComparator<Car>(new
    NormalOrderCarComparator()));

    System.out.println(cars1);
    System.out.println();
    System.out.println(cars2);
    System.out.println();
    System.out.println(cars3);
    System.out.println();
    System.out.println(cars4);
    System.out.println();
    }

    private static class Car
    implements Comparable<Car>
    {
    int speed;

    public Car(int speed){
    this.speed = speed;
    }

    public int compareTo(Car o) {
    return speed - o.speed;
    }

    public String toString(){
    return "Car[speed=" + speed + "]";
    }
    }

    private static class NormalOrderCarComparator
    implements Comparator<Car>
    {
    public int compare(Car o1, Car o2) {
    return o1.speed - o2.speed;
    }
    }
    }

    </code>


    --
    DF.
    Daniele Futtorovic, Aug 5, 2008
    #2
    1. Advertising

  3. wrote:
    > I have an object (say, Car). Car contains some values, one of which
    > is speed. I want to store lots of cars in some sort of object that
    > will keep them sorted by speed. Some cars may have the same speed.
    > The catch is that I want to sort by highest speed, not lowest speed.
    > If I insert lots of cars into a TreeSet, with the key being the speed,
    > I get them in increasing order. If there are n cars with the same
    > speed, I get only one, because the keys are identical. I've been
    > unable to find an object that would work. I've tried implementing a
    > compare method in my object, and that doesn't help either. Any ideas?
    >
    > To summarize, the container object must:
    > 1) Support sorting in inverse order (or another order of my choice)
    > 2) Keep the objects sorted.
    > 3) Support duplicate objects.
    >
    > (I suppose I could sort on the negative value of the sort key, but...)
    >
    > Thanks!


    You can keep the objects in a sorted array using a comparator to sort on
    whatever field you want. Duplicate objects implies duplicate keys which
    I don't think is possible with Maps or Sets so some sort of array you
    keeps sorted is probably your best bet.

    --

    Knute Johnson
    email s/nospam/knute2008/

    --
    Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
    ------->>>>>>http://www.NewsDemon.com<<<<<<------
    Unlimited Access, Anonymous Accounts, Uncensored Broadband Access
    Knute Johnson, Aug 5, 2008
    #3
  4. Roedy Green Guest

    On Tue, 5 Aug 2008 11:22:16 -0700 (PDT),
    ""
    <> wrote, quoted or indirectly quoted
    someone who said :

    >I have an object (say, Car). Car contains some values, one of which
    >is speed. I want to store lots of cars in some sort of object that
    >will keep them sorted by speed. Some cars may have the same speed.
    >The catch is that I want to sort by highest speed, not lowest speed.
    >If I insert lots of cars into a TreeSet, with the key being the speed,
    >I get them in increasing order. If there are n cars with the same
    >speed, I get only one, because the keys are identical. I've been
    >unable to find an object that would work. I've tried implementing a
    >compare method in my object, and that doesn't help either. Any ideas?
    >
    >To summarize, the container object must:
    >1) Support sorting in inverse order (or another order of my choice)
    >2) Keep the objects sorted.
    >3) Support duplicate objects.
    >
    >(I suppose I could sort on the negative value of the sort key, but...)
    >
    >Thanks!


    see
    http://mindprod.com/jgloss/comparator.html#REVERSEORDER
    http://mindprod.com/jgloss/treeset.html


    --

    Roedy Green Canadian Mind Products
    The Java Glossary
    http://mindprod.com
    Roedy Green, Aug 6, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    2
    Views:
    9,245
    Martin Honnen
    Sep 5, 2006
  2. Replies:
    7
    Views:
    731
    Stefan Arentz
    Sep 10, 2007
  3. sajuptpm
    Replies:
    7
    Views:
    794
    Terry Reedy
    Sep 8, 2010
  4. Navin
    Replies:
    1
    Views:
    672
    Ken Schaefer
    Sep 9, 2003
  5. Antonio Quinonez
    Replies:
    2
    Views:
    155
    Antonio Quinonez
    Aug 14, 2003
Loading...

Share This Page