Hi,

Forget it, I fixed it myself by modifying the RowSorter class and now it can sort 
Integers, boolean, Date, Decimals and Strings that contains Integers or whatever else, 
like "BSLD-WK13-04"

Regards,
Bard

----- Original Message -----
From: B�rd Arve Evjen <[EMAIL PROTECTED]>
Date: Fri, 23 Apr 2004 17:08:53 +0800
To: [EMAIL PROTECTED]
Subject: [displaytag-user] Custom decorator to fix complex sorting

> Hi,
> 
> I a trying to figure out how to implement my own sorting for a table decorator that 
> checks on dates, integers and strings. E.g. I want to sort a string that contains 
> several integers, like '134-234-2311'. I have made my own table decorator that 
> extends displaytag TableDecorator and added a new function 
> 
> public int compareTo(Object o1, Object o2) {
>   return new StringSort().compareTo(o1, o2);
> }
> 
> both in my own decorator and in TableDecorator, like:
> 
> public int compare(Object o1, Object o2) {
>   return 0;
> }
> 
> The StringSort class looks like this:
> 
> import com.om.condico.util.quantity.Quantity;
> 
> import java.util.Date;
> import java.util.HashMap;
> 
> import org.apache.log4j.Logger;
> 
> public class StringSort {
>     String str1, str2, dataType;
>     static HashMap delimiterMap;
>     static HashMap typeMap;
>     //Logger
>     static Logger log = Logger.getLogger(StringSort.class);
>     
>     static {
>         delimiterMap = new HashMap();
>         typeMap = new HashMap();
>         delimiterMap.put(new Integer("-".hashCode()), "-");
>         delimiterMap.put(new Integer("/".hashCode()), "/");
>         delimiterMap.put(new Integer("_".hashCode()), "_");
>         typeMap.put(new Integer("integer".hashCode()), "int");
>         typeMap.put(new Date("date".hashCode()), "date");
>         typeMap.put(new Date("string".hashCode()), "string");
>         typeMap.put(new Quantity("quantity".hashCode()), "quantity"); // BAE
>     }
> 
>     public int compareTo(Object obj1, Object obj2) {
>         dataType = null;
>         log.debug("going in to stringsort");
>         if (obj1 instanceof String && obj2 instanceof String) {
>             str1 = (String) obj1;
>             str2 = (String) obj2;
>             //is this date objects ?
>             try {
>                 java.text.SimpleDateFormat sdf =
>                         new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss z");
>                 java.util.Date d1 = sdf.parse(str1);
>                 java.util.Date d2 = sdf.parse(str2);
>                 return d1.compareTo(d2);
>             } catch (Exception ex) { /*do nothing, just continue*/
>             }
>             //is this integer objects ?
>             try {
>                 Integer i1 = new Integer(str1);
>                 Integer i2 = new Integer(str2);
>                 return i1.compareTo(i2);
>             } catch (Exception ex) {/*do nothing, just continue*/
>             }
> 
>             // BAE is this integer objects ?
>             try {
>                 Quantity i1 = new Quantity(str1);
>                 Quantity i2 = new Quantity(str2);
>                 return i1.getAmountAsString().compareTo(i2.getAmountAsString());
>             } catch (Exception ex) {/*do nothing, just continue*/
>             }
> 
>             String delimiter1 = findDelimiter(str1);
>             String delimiter2 = findDelimiter(str2);
>             if (delimiter1 == null && delimiter2 == null)
>                 return str1.compareTo(str2);
> 
>             if (delimiter1.equalsIgnoreCase(delimiter2)) {
>                 try {
>                     new Integer(cifferBeforeDelimiter(str1, delimiter1));
>                     new Integer(cifferBeforeDelimiter(str2, delimiter2));
>                     if (cifferBeforeDelimiter(str1, delimiter1) < 
> cifferBeforeDelimiter(str2, delimiter2))
>                         return -1;
>                     if (cifferBeforeDelimiter(str1, delimiter1) > 
> cifferBeforeDelimiter(str2, delimiter2))
>                         return 1;
>                     if (cifferBeforeDelimiter(str1, delimiter1) == 
> cifferBeforeDelimiter(str2, delimiter2)) {
>                         try {
>                             new Integer(cifferAfterDelimiter(str1, delimiter1));
>                             new Integer(cifferAfterDelimiter(str2, delimiter2));
>                             if (cifferAfterDelimiter(str1, delimiter1) < 
> cifferAfterDelimiter(str2, delimiter2))
>                                 return -1;
>                             if (cifferAfterDelimiter(str1, delimiter1) > 
> cifferAfterDelimiter(str2, delimiter2))
>                                 return 1;
>                             if (cifferAfterDelimiter(str1, delimiter1) == 
> cifferAfterDelimiter(str2, delimiter2))
>                                 return 0;
>                         } catch (Exception eex) {
>                             return 0;
>                         }
> 
>                     }
>                 } catch (Exception eeex) {
>                     try {
>                         new Integer(cifferAfterDelimiter(str1, delimiter1));
>                         new Integer(cifferAfterDelimiter(str2, delimiter2));
>                         if (cifferAfterDelimiter(str1, delimiter1) < 
> cifferAfterDelimiter(str2, delimiter2))
>                             return -1;
>                         if (cifferAfterDelimiter(str1, delimiter1) > 
> cifferAfterDelimiter(str2, delimiter2))
>                             return 1;
>                         if (cifferAfterDelimiter(str1, delimiter1) == 
> cifferAfterDelimiter(str2, delimiter2))
>                             return 0;
> 
>                     } catch (Exception eex) {
>                         return 0;
>                     }
>                 }
>             }
>             else
>                 return 0;
> 
>         }
>         return 0;
>     }
> 
>     private String findDelimiter(String str) {
>         char[] ch = str.toCharArray();
>         for (int i = 0; i < ch.length; i++) {
>             String strCh = new String(new char[]{ch[i]});
>             Integer hc = new Integer(strCh.hashCode());
>             if (delimiterMap.containsKey(hc)) {
>                 //System.out.println("delimiter found: "+(String)map.get(hc));
>                 return (String) delimiterMap.get(hc);
>             }
>         }
>         return null;
>     }
> 
>     private int cifferBeforeDelimiter(String str, String delimiter) throws 
> NumberFormatException {
>         String ciffer = str.substring(0, getDelimiterIndex(str, delimiter));
>         //System.out.println("ciffer found: "+ciffer);
>         return new Integer(ciffer).intValue();
>     }
> 
>     private int cifferAfterDelimiter(String str, String delimiter) {
>         String ciffer = str.substring(getDelimiterIndex(str, delimiter) + 1, 
> str.length());
>         //System.out.println("ciffer found: "+ciffer);
>         return new Integer(ciffer).intValue();
>     }
> 
>     private int getDelimiterIndex(String str, String delimiter) {
>         return str.indexOf(delimiter);
>     }
> 
> }
> 
> ---------
> 
> Now to my problem: The compareTo fuction is not called in my decorator, how can I 
> specify that it should always call my compareTo function?
> 
> Thanks,
> Bard A.
> -- 
> _____________________________________________________________
> Web-based SMS services available at http://www.operamail.com.
> From your mailbox to local or overseas cell phones.
> 
> Powered by Outblaze
> 
> 
> -------------------------------------------------------
> This SF.net email is sponsored by: The Robotic Monkeys at ThinkGeek
> For a limited time only, get FREE Ground shipping on all orders of $35
> or more. Hurry up and shop folks, this offer expires April 30th!
> http://www.thinkgeek.com/freeshipping/?cpg=12297
> _______________________________________________
> displaytag-user mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/displaytag-user

-- 
_____________________________________________________________
Web-based SMS services available at http://www.operamail.com.
>From your mailbox to local or overseas cell phones.

Powered by Outblaze


-------------------------------------------------------
This SF.net email is sponsored by: The Robotic Monkeys at ThinkGeek
For a limited time only, get FREE Ground shipping on all orders of $35
or more. Hurry up and shop folks, this offer expires April 30th!
http://www.thinkgeek.com/freeshipping/?cpg=12297
_______________________________________________
displaytag-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/displaytag-user

Reply via email to