Sort a vector of objects by one of its attributes

Hi all!
I have created this class:
public class Client {
private int numero;
private double tempsEntrada;
private double tempsServei;
private double tempsIniciSessio;
private char tipus;
* Creates a new instance of Client
public Client(int num, double temp,double servei, char tip) {
numero = num;
arrivalTime = temp;
serviceTime = servei;
tipus = tip;
public char getTipus()
return tipus;
public int getNumero()
return numero;
public double getTempsEntrada()
return arrivalTime;
public double getTempsServei()
return serviceTime;
Now I've done a java vector of this object, and I want to sort it by arrivalTime.
The class comparer looks like this
public class Comparer implements Comparator {
public int compare(Object obj1, Object obj2)
double temps1 = ((Client)obj1).getTempsEntrada();
double temps2 = ((Client)obj2).getTempsEntrada();
return (int)(temps1 - temps2);
now when I do Collections.sort(vector);
this is the error reported:
Exception in thread "main" java.lang.ClassCastException: cafevirtual.Client cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Arrays.java:1144)
at java.util.Arrays.mergeSort(Arrays.java:1155)
at java.util.Arrays.mergeSort(Arrays.java:1155)
at java.util.Arrays.sort(Arrays.java:1079)
at java.util.Collections.sort(Collections.java:117)
at cafevirtual.Main.main(Main.java:76)
Java Result: 1
what's wrong?
thanks!

Your Client class does not implement Comparable. You have to specify the Comparator to use: Collections.sort(vector, new Comparer());

Similar Messages

  • Sort 2 Vector containg Objects

    I have 2 Vector , both contains objects
    I merge both the vector and make one Vector of Objects.
    Now i want to sort the Vector with the date filed.
    Can anybody write the code sorting the vector of objects on the basis of Date.?

    I have Vector name Employee( this contais object)
    Attribute: Name , Age , Date(on which user make entry:sysdate)
    like :
    Vector Employee= new Vector();
    Collections.sort(list,comparator);
    Plz help me how to use this Collections.sort(list,comparator);?
    What should be the code for comparator.?

  • Sorting a vector of objects using attribute of object class as comparator

    i would like to sort a vector of objects using an attribute of object class as comparator. let me explain, i'm not sure to be clear.
    class MyObject{
    String name;
    int value1;
    int value2;
    int value3;
    i've got a Vector made of MyObject objects, and i would sort it, for instance, into ascending numerical order of the value1 attribute. Could someone help me please?
    KINSKI.

    Vector does not implement a sorted collection, so you can't use a Comparator. Why don't you use a TreeSet? Then you couldclass MyObject
      String name;
      int value1;
      int value2;
      int value3;
      // Override equals() in this class to match what our comparator does
      boolean equals (Object cand)
        // Verify comparability; this will also allow subclasses.
        if (cand !instanceof MyObject)
          throw new ClassCastException();
        return value1 = cand.value1;
      // Provide the comparator for this class. Make it static; instance not required
      static Comparator getComparator ()
        // Return this class's comparator
        return new MyClassComparator();
      // Define a comparator for this class
      private static class MyClassComparator implements Comparator
        compare (Object cand1, Object cand2)
          // Verify comparability; this will also allow subclasses.
          if ((cand1 !instanceof MyObject) || (cand2 !instanceof MyObject))
            throw new ClassCastException();
          // Compare. Less-than return -1
          if ((MyObject) cand1.value1 < (MyObject) cand2.value1))
            return -1;
          // Greater-than return 1
          else if ((MyObject) cand1.value1 > (MyObject) cand2.value1))
            return 1;
          // Equal-to return 0.
          else
            return 0;
    }then just pass MyObject.getComparator() (you don't need to create an instance) when you create the TreeSet.

  • Sorting a vector of objects?

    I'm having a real hard time sorting my vector, which contains objects that are made up of 4 Strings and 1 integer each.
    This is what I have for the sort routine, but something needs to go in the line that has "if (current.compareTo(smallest) < 0 )" to make it access the name fields of the current and smallest elements.
    Any ideas?
    Thanks,
    Mike
    private void sortname() {
         int nextslot;
         int max = cust_rex.size()-1;
         for (nextslot = 0; nextslot < max; nextslot++) {
              int j = getSmallestName(nextslot);
              swap (nextslot, j);
    private void swap(int a, int b) {
         Object temp = cust_rex.elementAt(a);
         cust_rex.setElementAt(cust_rex.elementAt(b),a);
         cust_rex.setElementAt(temp,b);
    private int getSmallestName (int k) {
         if (cust_rex == null || cust_rex.size() <= k)
              return -1; //error value
         int small = k;
         for (int i = k + 1; i < cust_rex.size(); i++) {
         Customer current = (Customer) cust_rex.elementAt(i);
         Customer smallest = (Customer) cust_rex.elementAt(small);
         if (current.compareTo(smallest) < 0 )
              small = i;
         return small;
         }

    Look at java.util.Comparator and write your own comparator. Then look at java.util.Collections and use the sort method from there instead of writing your own.

  • Sorting a Vector. Can some one guide please?

    Folks,
    How do I sort the elements in a Vector?
    If I have a vector containing different names,
    how can sort this out in ascending order?
    Please can any one send in a small example that I can
    modify to suit my requirments.
    Thanks
    Ajay

    Vector v = getMeAVector();
    java.util.Collections.sort(v);will do it just fine if whatever is in the Vector implements the Comparable interface.

  • How to sort a Vector that stores a particular object type, by an attribute?

    Hi guys,
    i need help on this problem that i'm having. i have a vector that stores a particular object type, and i would like to sort the elements in that vector alphabetically, by comparing the attribute contained in that element. here's the code:
    Class that creates the object
    public class Patient {
    private String patientName, nameOfParent, phoneNumber;
    private GregorianCalendar dateOfBirth;
    private char sex;
    private MedicalHistory medHistory;
    public Patient (String patientName, String nameOfParent, String phoneNumber, GregorianCalendar dateOfBirth, char sex) {
    this.patientName = patientName;
    this.nameOfParent = nameOfParent;
    this.phoneNumber = phoneNumber;
    this.dateOfBirth = dateOfBirth;
    this.sex = sex;
    this.medHistory = new MedicalHistory();
    Class that creates the Vector.
    public class PatientDatabase {
    private Vector <Patient> patientDB = new Vector <Patient> ();
    private DateFunction date = new DateFunction();
    public PatientDatabase () throws IOException{
    String textLine;
    BufferedReader console = new BufferedReader(new FileReader("patient.txt"));
    while ((textLine = console.readLine()) != null) {
    StringTokenizer inReader = new StringTokenizer(textLine,"\t");
    if(inReader.countTokens() != 7)
    throw new IOException("Invalid Input Format");
    else {
    String patientName = inReader.nextToken();
    String nameOfParent = inReader.nextToken();
    String phoneNum = inReader.nextToken();
    int birthYear = Integer.parseInt(inReader.nextToken());
    int birthMonth = Integer.parseInt(inReader.nextToken());
    int birthDay = Integer.parseInt(inReader.nextToken());
    char sex = inReader.nextToken().charAt(0);
    GregorianCalendar dateOfBirth = new GregorianCalendar(birthYear, birthMonth, birthDay);
    Patient newPatient = new Patient(patientName, nameOfParent, phoneNum, dateOfBirth, sex);
    patientDB.addElement(newPatient);
    console.close();
    *note that the constructor actually reads a file and tokenizes each element to an attribute, and each attribute is passed through the constructor of the Patient class to instantiate the object.  it then stores the object into the vector as an element.
    based on this, i would like to sort the vector according to the object's patientName attribute, alphabetically. can anyone out there help me on this?
    i have read most of the threads posted on this forum regarding similar issues, but i don't really understand on how the concept works and how would the Comparable be used to compare the patientName attributes.
    Thanks for your help, guys!

    Are you sure that you will always sort for the patient's name throughout the application? If not, you should consider using Comparators rather than implement Comparable. For the latter, one usually should ensure that the compare() method is consistent with equals(). As for health applications it is likely that there are patients having the same name, reducing compare to the patient's name is hazardous.
    Both, Comparator and Comparable are explained in Sun's Tutorial.

  • Sorting a vector using the selection sort method

    I have to write a program that sorts a Vector using the selection sort algorithm. Unfortunately the textbook only has about 2 pages on vectors so needless to say I'm pretty clueless on how to manipulate vectors. However I think I'm on the right path, however I'm stuck on one part as shown in the code below.     
    private static void  selectionSort(Vector parts)
          int index;
            int smallestIndex;
            int minIndex;
            int temp = 0;
            for (index = 0; index < parts.size() - 1; index++)
              smallestIndex = index;
              for (minIndex = index + 1; minIndex < parts.size(); minIndex++)
               if (parts.elementAt(minIndex) < parts.elementAt(smallestIndex))  // this is where I'm having trouble
                  smallestIndex = minIndex;
                parts.setElementAt(temp, smallestIndex);
                parts.setElementAt(smallestIndex, index);
                parts.setElementAt(index, temp); if (parts.elementAt(minIndex) < parts.elementAt(smallestIndex))
    is returning "ProcessParts3.java:51: operator < cannot be applied to java.lang.Object,java.lang.Object"
    Here is the full program:
    import java.util.*;
    import java.io.*;
    public class ProcessParts3
         static Vector parts;
         public static void main(String[] args)
              loadVector();
         private static void loadVector()
         try
              Scanner fileIn = new Scanner(new File("productionParts.txt"));
              parts = new Vector();
              String partIn;
              while (fileIn.hasNext())
                   partIn = fileIn.nextLine();
                        parts.addElement(partIn.trim());
              selectionSort(parts);
                   for (int i = 0; i < parts.size(); i ++)
                   System.out.println(parts.elementAt(i));
         catch(Exception e)
              e.printStackTrace();
         private static void  selectionSort(Vector parts) //from this part down I'm responsible for the coding, everything
                                                               // everything above this was written by the teacher
                 int index;
            int smallestIndex;
            int minIndex;
            int temp = 0;
            for (index = 0; index < parts.size() - 1; index++)
                smallestIndex = index;
                for (minIndex = index + 1; minIndex < parts.size(); minIndex++)
                    if (parts.elementAt(minIndex) < parts.elementAt(smallestIndex))
                        smallestIndex = minIndex;
                parts.setElementAt(temp, smallestIndex);
                parts.setElementAt(smallestIndex, index);
                parts.setElementAt(index, temp);
    }Edited by: SammyP on Nov 27, 2009 11:43 AM

    SammyP wrote:
    I have to write a program that sorts a Vector using the selection sort algorithm...Hmmm.... Your teacher is, in my humble opinion, a bit of a tard.
    1. Vector is basically deprecated in favor of newer implementations of the List interface which where introduced in [the collections framework|http://java.sun.com/docs/books/tutorial/collections/index.html] with Java 1.5 (which became generally available back in May 2004, and went end-of-support Oct 2009). ArrayList is very nearly a "drop in" replacement for Vector, and it is much better designed, and is marginally more efficient, mainly because it is not syncronised, which imposes a small but fundamentally pointless overhead when the collection is not being accessed across multiple threads (as is the case in your program).
    2. Use generics. That "raw" Vector (a list of Objects) should be a genericised List<String> (a list of Strings)... because it's compile-time-type-safe... mind you that definately complicates the definition of your static sort method, but there's an example in the link... Tip: temp should be of type T (not int).
    Note that String implements [Comparable<String>|http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html], so two String's can safely be compared using the compareTo method... In Java the mathematical operators (<, >, &#43;, -, /, &#42;, etc) are only applicable to the primitive types (byte char, int, float, etc)... The Java Gods just chose to muddy the waters (especially for noobs) by "overloading" the &#43; operator for String (and String only) to enable succinct, convenient string-concatenation... which I personally now see as "a little bit of a mistake" on there part.
         private static void  selectionSort(Vector parts)  {
    int index, smallestIndex, minIndex, temp = 0;
    for (index = 0; index < parts.size() - 1; index++) {
    smallestIndex = index;
    for (minIndex = index + 1; minIndex < parts.size(); minIndex++) {
    if (parts.elementAt(minIndex) < parts.elementAt(smallestIndex)) {
    smallestIndex = minIndex;
    parts.setElementAt(temp, smallestIndex);
    parts.setElementAt(smallestIndex, index);
    parts.setElementAt(index, temp);
    }3. ALLWAYS use {curly braces}, even when not strictly necessary for correctness, because (a) they help make your code more readable to humans, and also (b) if you leave them out, you will eventually stuff it up when you insert a line in the expectation that it will be part of the if statement (for example) but you forgot to also add the now mandatory curly-braces... This is far-too-common source of bugs in noob-code. Almost all professionals, nearly allways allways use curly braces, most of the time ;-)
    4. Variable names should be meaningful, except (IMHO) for loop counters... Ergo: I'd rename index plain old i, and minIndex to plain old j
        for ( int i=0; i<list.size()-1; ++i) {
          int wee = i; // wee is the index of the smallest-known-item in list.
          for ( int j=i+1; j<list.size(); ++j ) {Cheers. Keith.
    Edited by: corlettk on 28/11/2009 09:49 ~~ This here fraggin forum markup friggin sucks!

  • Best way of sorting a Vector by member variable

    I have a Vector of objects called Node. Each Node has various member variables, one of which is an integer called cost.
    What would be the best way of sorting this vector in ascending order of cost?
    I tried Bubble Sort but once the Vector starts getting big, it is SO slow.
    Any help much appreciated.
    Thanks,
    Peter

    Declare your Node like this:public class Node ... implements Comparable {
      // your other code here
      public int compareTo(Object o) {
        Node otherNode = (Node)o;
        return this.cost - otherNode.cost;
    }That code provides a "natural ordering" for your Node class. Then to sort your Vector, just do this:Collections.sort(yourVector);I don't know what kind of sort that will do, but no doubt it will be better than your bubble sort.

  • How to create multiple TYPES of objects from one menu?

    Q: How can I create a single class to create objects of multiple 'object classes' in a way that is not a huge switch statement?
    Explaination:
    Let's say that I have an application that I am building, that manages five hundred object types. A properly-built object subclassing tree is created, and I want to be able to create objects of any 'leaf node' of this subclassing tree using a single 'objectCreate()' method in a 'factory object'. The purpos of this method will be to create an instance of the correct object, pass a handle to a few collections for properly sorting and storing these objects in groups.
    Usually, one could create a switch in this function, testing for the type of object that the user wants to create from the menu. But in the case of having hundreds of possible object choices, this becomes harder and harder code to maintain (let alone performance).
    Any suggestions?

    But if my menu has:
    1. German Shepard
    2. Doberman Pinscher
    3. Malamut
    4. Persian Long-hair
    5. Siamese
    6. Tabby
    And my object class tree goes:
                                  [ Animal ]
                 [ Cat ]                              [ Dog ]
      [ various breeds ]                         [ various breeds ]How do I code the menu class to respond to the input, so that it runs the correct [breed] object's constructor?
    The line:
    Animal choice = new xxxxxxxx();
    I can't use a variable to replace 'xxxxxxxx' in run-time, but having a ton of choices in code sounds/looks unreasonable.
    if (choice == "Doberman Pinscher")
    Animal choice = new doberman();
    else if (choice == "Tabby")
    Animal choice = new tabby();
    Do you see what I am trying to avoid? I am not experienced enough to instantly realize how to avoid the latter, and instead, do a single instantiation command for the correct constructor.

  • Possible?Multi-Entity View Object with one Entity Object that is Read-only.

    I know this sounds crazy, but I would like to create a multi-entity view object, where one entity object is based on a table in my application (we'll call it "Users", which basically stores the primary key for the person from the institutional people database), and the other table is a entity object based on a view of the institutional people database table (read only access), which we can call "People".
    I know that since no updates will be done to the People table, it really should be a read-only View Object, but I would lose the ability to sort on attributes like Last Name, Hire date, etc, since those would be transient attributes in my ViewObject for the Users. By having People as an entity object, I can then create a multi entity view object and have the ability to join Users to People and be able to sort on the above mentioned fields (like Last Name).
    The problem is that when I use the JDev (I'm currently using 10.1.2.1) AppModule BC4J tester, when I click on the multi-entity view object that I added to the AppModule it gives me an error:
    oracle.jbo.RowCreateException) JBO-25017: Error while creating a new entity row for People.
    ----- LEVEL 1: DETAIL 0 -----
    (java.lang.InstantiationException) null
    I have tried to change all the attributes to updateable in my entity object, but no create method, and I have tried to make them all read-only, but no effect, I get the same error (probably because the People view is read-only in my schema).
    Is there a way to change the entity object so that it will not try to create a new row when it runs the Tester? So that the multi entity view object behaves more like a view link, but gives me the added bonus of being able to sort on the Last Name column from the People table?
    Thanks for any help on this subject...at worst, I will have to use the view link method to get the job accomplished, but it would be "cooler" if this would work!
    Jeremy.

    Steve, thanks for your quick response to my question.
    To answer your questions, I was trying to create the Multi-entity View Object to give me more flexibility when working with my User table, and my People view. The flexibility I desired was that I would be able to sort my Users based on attributes in the People view. This is not possible when the there is only one Entity in my VO, and the People view data are all transient attributes, because they are not in the SQL statement.
    Ultimately, after working with one of my colleagues, we decided to use the approach that you mentioned by creating a read-only VO with the SQL query we want to display to the user (contains both User and People data fields), and then use a different ViewObject when performing other actions on the User Table (such as inserts/updates/deletes). By using the setWhereClauseParam() method in the handleLifeCycle() for the JSP page, we should be able to navigate between the different View Objects, so that the user does not see any difference.
    Thanks! Oh, and by the way, I have read your article you included before, and I have used it many times before to tune my View Objects! Thanks!

  • PS opens vector smart object all pixilated

    I have this problem when using graphics from Illustrator as vector smart objects in Photoshop. I have followed tones of heated discussions on this but I haven't got any further. So here is what I do following the steps on the PS help: I copy graphics in AI and paste them in PS as smart object. A layer will be added that even has the name vector smart object but the graphic itself is all pixilated. Now the size of my PS-file is 150X150 Pixels with a resolution of 300. I need this size because I want to implement the file into my website and the layout requires this size for all my graphics. I would say it doesn't matter much what size the file is anyway since according to the PS help whatever vector smart object I place in Photoshop it won't change image quality when transformed. Therefor I'd say that not even the small file should be a problem here. But obviously there is something not working... because even when, to compare, I paste the graphic as pixel it shows the same result. Strange enough that I have used this vector smart objects before and it worked just fine... So I tried to paste the graphic in different ways, saving it as pdf in AI and then placing it in PS, insert it directly as smart object, making sure the file handling and clipboard references are adjusted, and finally after no success trashing the preferences in both applications. Still not closer to a satisfying result. I attach the graphics (first the AI graphic, then the vector smart object from PS) to show the difference and maybe there is someone out there that can tell what I am doing wrong. By the way I just converted the files to jpegs to post them here so the sizes might not match on the screen...

    One other thing to check...
    Are you viewing the display at 100%?
    Photoshop's OpenGL-based image resizing algorithms are smoother and fuzzier than they used to be (or than they are with OpenGL disabled).  What I'm getting at is that you may be perceiving fuzziness in the display that's not really there in the image.
    How does the fuzziness look if you zoom in a lot?
    -Noel

  • Flv player is opening vector smart objects instead of illustrator.

    How do I re-associate vector smart objects in Photoshop to open in Illustrator as they did before the update?

    Editing smart objectrs uses the system wide associations, not the ones from Bridge, so you need to adjust that for the *.ai file type.
    Mylenium

  • How to Filter & Sort on Cached view object data?

    We are using JDeveloper 9.0.3.4 and implemeting a Struts/JSP application that query's via view object on one table. Is it possible to sort and order by on the view object's cached data? How does one do this?
    Thanks
    Natalie

    As for filtering rows, there are two ways:
    1. In the VO that's sorting data (in my article), you can add logic to skip unmatching rows in the following methods:
    protected boolean hasNextForCollection(Object qc)
    protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet resultSet)
    2. In the base VO (unsorted), you can apply a RowQualifier. For example,
    oracle.jbo.server.RowQualifier rowQual = new oracle.jbo.server.RowQualifier("EmpDeptNum = 20");
    myVO.setRowQualifier(rowQual);
    Thanks.
    Sung

  • Java.util.Arrays.sort for Vector

    I used the java.util.Arrays.sort to sort an array based on the method below.
                  java.util.Arrays.sort(array, 0, total, new ComparatorX());
               repaint();
                class ComparatorX implements java.util.Comparator
              public int compare( Object p1, Object p2){
                   int x1=((Point)p1).x;
                   int x2=((Point)p2).x;
                   if(x1>x2)
                                return 1;
                   if(x1>x2)
                                return -1;
                   return 0;
         }I've since changed the array to a vector. Is there anyway I can keep the comparator. Or how can I sort the vector based on the above method.

    BTW: Don't know if it's just a typing mistake, but your code contains an error:
    class ComparatorX implements java.util.Comparator     {
       public int compare( Object p1, Object p2) {
          int x1=((Point)p1).x;
          int x2=((Point)p2).x;
          if (x1>x2) {
             return 1;
          if (x1>x2) {  // Should be: if (x2 > x1) ...
             return -1;
          return 0;

  • Vector smart object? Big deal.

    My primary use for Photoshop is for producing illustrations rather than manipulating photographs. With that in mind, I don't understand the revolutionary nature of "Vector" Smart Objects, since once they land in Photoshop they cease to have any "vector" qualities. They can be resized, distorted, and made more or less transparent, which is fine, but all those things can be done to any raster Photoshop layer.  So my feature request is: since Photoshop's Path tool  can deal in vector art within Photoshop, why can't that facility be extended to the Smart Objects? I realize that what I am asking amounts to asking for Illustrator to be installed inside Photoshop, but why not? I think there was an app that worked that way-Deneba Canvas? I don't know, maybe only illustrators who work in both Photoshop and Illustrator would care about this, but I do a lot of it-produce an item in Adobe Illustrator for use in a picture, then copy and paste it into a scanned figure opened in Photoshop, then add shadows and tones. It would be helpful to be able to manipulate the vector art as vector art in Photoshop.

    ya, you  have to open it up in ai like the above post said if you want to edit it. but also one of the advantages to smart objects is that when you resize it, the quality remains unchanged as long as it is equal to or smaller than the original size. for example, if you design a button in illustrator, then you put it on a web page in photoshop and scale it down and hit enter, you can always make it bigger (up to original size) without losing quality. if you did this with a regular raster image you cannot size it up without losing quality.
      the reason you cannot edit the vectors in photoshop is that vector and raster are different types of files. it's kindof like trying to edit videos in photoshop. just wont work. it'd be cool if you could though because i am in your shoes too.

Maybe you are looking for

  • How to Enable a Push Button In The Form That Is Always Greyed Out?

    Greetings All, I am trying to enable an existing "Return" Push Button(PB) which is always greyed out whenever the form is called in either an update or review mode. After some research, I found that this PB's functional property is "Enabled" (i.e. th

  • Can I connect my 3rd generation iPod shuffle to external speakers

    Can I connect my 3rd generation IPod shuffle to external speakers? When I plug it into an external speaker, it stops playing and I don't hear any music. The controls eg. Volume, play etc is on the earplug cord. Thanks

  • Pictures not showing in Elements

    When I download groups of pictures , they no longer show the image in the main screen within elements it just shows an egg timer. When I click each one they do load and i can edit but not easy to navigate when I have 800 shots to glance through , cou

  • I HAVE ADOBE ACROBAT PRO.  IT WILL NOT OPEN/WORK.

    HAVE HAD THIS SAME PROBLEM BEFORE.  HPPSC217. WAS TOLD TO GO TO PHOTOSHOP AND DEACTIVATE ACROBATX PRO. WILL TRY RE-INSTALLING - DON'T KNOW WHAT ELSE TO DO.

  • After Effects CS4 question

    Hi, Is there a patch to install After Effects CS4 on an AMD Athlon 3200? AE recognises the cpu as a powerpc and won't install. Thank You, John