Navjot is the winner by now, this the code I'm using to test and the
results.
Thanks for your responses.

Guillermo.

-------------------------------------------------------------
| Executing performance test in Case Insensitive Maps       |
-------------------------------------------------------------
-------------------------------------------------------------
Run: 1/3
        Time (ms): 2312: MapTester$UpperCaseMap
        Time (ms): 1469: MapTester$TreeMapUpperCaseMap
        Time (ms): 812: MapTester$IgnoreCaseIntegerMap
        Time (ms): 766: MapTester$IgnoreCaseBitMap
-------------------------------------------------------------
-------------------------------------------------------------
Run: 2/3
        Time (ms): 2234: MapTester$UpperCaseMap
        Time (ms): 1391: MapTester$TreeMapUpperCaseMap
        Time (ms): 766: MapTester$IgnoreCaseIntegerMap
        Time (ms): 750: MapTester$IgnoreCaseBitMap
-------------------------------------------------------------
-------------------------------------------------------------
Run: 3/3
        Time (ms): 2203: MapTester$UpperCaseMap
        Time (ms): 1390: MapTester$TreeMapUpperCaseMap
        Time (ms): 813: MapTester$IgnoreCaseIntegerMap
        Time (ms): 797: MapTester$IgnoreCaseBitMap
-------------------------------------------------------------

And this is the code:

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class MapTester {
        final long running = 200000;
        
        MapTester() {
        
System.out.println("----------------------------------------------------
---------");
                System.out.println("| Executing performance test in Case
Insensitive Maps       |");
        
System.out.println("----------------------------------------------------
---------");
        }
        
        private void runTest(Map mapa) {
                long init = System.currentTimeMillis();
                for(int i=0;i<running;i++) {
                        mapa.put("propertyName1", new Integer(i+1));
                        mapa.put("propertyName2", new Integer(i+2));
                        mapa.put("propertyName3", new Integer(i+3));
                        mapa.put("propertyName4", new Integer(i+4));
                        mapa.put("propertyName5", new Integer(i+5));
                        
                }

                for(int i=0;i<running;i++) {
                        mapa.get("PropertyName1");
                        mapa.get("PropertyName2");
                        mapa.get("PropertyName3");
                        mapa.get("PropertyName4");
                        mapa.get("PropertyName5");
                }

                long end = System.currentTimeMillis();          
                System.out.println("\tTime (ms): " + (end - init) + ": "
+ mapa.getClass().getName());
        }

        
        public static void main(String[] args) {
                int cantCorridas=3;
                MapTester mt = new MapTester();
                for(int i=0;i<cantCorridas;i++) {
        
System.out.println("----------------------------------------------------
---------");
                        System.out.println("Run: " + (i+1) + "/" +
cantCorridas);
        
                        mt.runTest(new UpperCaseMap());
                        
                        mt.runTest(new TreeMapUpperCaseMap());
        
                        mt.runTest(new IgnoreCaseIntegerMap());
                        
                        mt.runTest(new IgnoreCaseBitMap());
        
System.out.println("----------------------------------------------------
---------");
                }       
        }
        
        private static  class UpperCaseMap extends HashMap {
                public Object put(Object key, Object value) {
                        return super.put(key.toString().toUpperCase(),
value);
                }

                public Object get(Object key) {
                        return
super.get((key.toString()).toUpperCase());
                }
        }
        
        private  static class TreeMapUpperCaseMap extends TreeMap {
                public TreeMapUpperCaseMap() {
                        super(String.CASE_INSENSITIVE_ORDER);
                }
        }
                
        private static class IgnoreCaseIntegerMap extends HashMap {
                public Object put(Object key, Object value) {
                        return
super.put(this.generateKey(key.toString()), value);
                }

                public Object get(Object key) {
                        return
super.get(this.generateKey(key.toString()));
                }               

                private Object generateKey(String str) {

                        int len = str.length();
                        int h=0;
                        char val[] = str.toCharArray();
                        char c;
                        for (int i = 0; i < len; i++) {
                                c=val[i++];
                                if(c>=97 && c <=122)
                                        c-=32;

                                h = 31*h + c;
                        }
                        return new Integer(h);
                }
        }

        private static class IgnoreCaseBitMap extends HashMap {
                public Object put(Object key, Object value) {
                        return
super.put(this.generateKey(key.toString()), value);
                }

                public Object get(Object key) {
                        return
super.get(this.generateKey(key.toString()));
                }               

                private Object generateKey(String str) {        
                        int len = str.length();
                        int h=0;
                        char val[] = str.toCharArray();
                        for (int i = 0; i < len; i++) {
                                h = 31*h + (val[i++]&223);
                        }
                        return new Integer(h);
                }
        }

}


-----Original Message-----
From: Navjot Singh [mailto:[EMAIL PROTECTED] 
Sent: Sábado, 14 de Febrero de 2004 03:16 a.m.
To: Struts Users Mailing List; [EMAIL PROTECTED]
Subject: RE: [OT] Case insensitive Map keys


hi,

seems like you are ready to go down to bits. my 2 cents for you to try

==> convert string to array of bytes.

1. AND every byte with 11011111. all will give you same output. OR 2.
shift left the every byte by 3 bits.

keep pushing the resulting byte to another array.
create string again of those bytes.

Saves you 2 relations operator, one condiiton checking, one
subtraction-assign. object creation is same. you create Integer. I
create String.

please let us know if you gain some performance.


>-----Original Message-----
>From: Guillermo Meyer [mailto:[EMAIL PROTECTED]
>Sent: Friday, February 13, 2004 7:08 PM
>To: 'Struts Users Mailing List'
>Subject: RE: [OT] Case insensitive Map keys
>
>
>I'm trying the following:
>
>       public class KeyGeneratedMap extends HashMap {
>               public Object put(Object key, Object value) {
>                       return
>super.put(this.generateKey(key.toString()), value);
>               }
>
>               public Object get(Object key) {
>                       return
>super.get(this.generateKey(key.toString()));
>               }
>
>               /**
>               * This generates an integer object for Strings and are
>case insensitive, that is
>               * Hello and heLLO generate the same Integer object value
>               */
>               private Object generateKey(String str) {
>                       int len = str.length();
>                       int h=0;
>                       char val[] = str.toCharArray();
>                       char c;
>                       for (int i = 0; i < len; i++) {
>                               c=val[i++];
>                               if(c>=97 && c <=122)
>                                       c-=32;
>
>                               h = 31*h + c;
>                       }
>                       return new Integer(h);
>               }
>       }
>
>This by now is three times faster than using toUpperCase for storing 
>and retrievinig items from the hash. What do you think?
>
>-----Original Message-----
>From: Navjot Singh [mailto:[EMAIL PROTECTED]
>Sent: Viernes, 13 de Febrero de 2004 02:53 a.m.
>To: Struts Users Mailing List
>Subject: RE: [OT] Case insensitive Map keys
>
>
>oops!! thanks for correcting me freddy.
>
>well in that case, if you map is not modified frequently, try the 
>FastHashMap from the Apache Commons. either you override and read and 
>write your own.
>
>>-----Original Message-----
>>From: Villalba Arias, Fredy [BILBOMATICA] 
>>[mailto:[EMAIL PROTECTED]
>>Sent: Thursday, February 12, 2004 5:50 PM
>>To: Struts Users Mailing List
>>Subject: RE: [OT] Case insensitive Map keys
>>
>>
>>Navjot,
>>
>>I believe this is exactly what Guillermo CLEARLY stated he had already

>>tried (and is not efficient enough for him).
>>
>>If you had taken a little bit longer and read carefully, then maybe 
>>you'd have noticed.
>>
>>Regards,
>>Freddy.
>>
>>-----Mensaje original-----
>>De: Navjot Singh [mailto:[EMAIL PROTECTED]
>>Enviado el: jueves, 12 de febrero de 2004 13:14
>>Para: Struts Users Mailing List; [EMAIL PROTECTED]
>>Asunto: RE: [OT] Case insensitive Map keys
>>
>>yes. here it is.
>>
>>public CIMap extends HashMap
>>{
>>
>>      public Object get(String key)
>>      {
>>              return super.get(key.toLowerCase());
>>      }
>>
>>      public Object put(String key, Object value)
>>      {
>>              super.put(key.toLowerCase(),value);
>>      }
>>}
>>
>>This was simple implementation. By the time you ask the Q and wait for

>>reply. you could have written on your own.
>>
>>Navjot Singh
>>
>>
>>>-----Original Message-----
>>>From: Guillermo Meyer [mailto:[EMAIL PROTECTED]
>>>Sent: Thursday, February 12, 2004 5:24 PM
>>>To: 'Struts Users Mailing List'
>>>Subject: [OT] Case insensitive Map keys
>>>
>>>
>>>Hi:
>>>Does anyone know an implementation of Map where keys are String and 
>>>case insensitive? I want to do this:
>>>
>>>map.put("propertyName", "DATA");
>>>
>>>And then, I should be able to get the value like this: Object obj = 
>>>map.get("PROPERTYNAME");
>>>
>>>Or like this:
>>>Object obj = map.get("propertyname"); //or whatever. case 
>>>insensitive.
>>>
>>>We tried using toUppercase when putting and toUppercase when getting,

>>>and using equalsIgnoreCase but this is not as efficient as we need. 
>>>May there be a way to calculate a hash for strings in upper or lower 
>>>case to result in the same value?
>>>
>>>Thanks in advance.
>>>
>>>Guillermo.
>>>
>>>
>>>NOTA DE CONFIDENCIALIDAD
>>>Este mensaje (y sus anexos) es confidencial, esta dirigido 
>>>exclusivamente a las personas direccionadas en el mail y puede 
>>>contener informacion (i)de propiedad exclusiva de Interbanking S.A. o
>>>(ii) amparada por el secreto profesional. Cualquier opinion en el 
>>>contenido, es exclusiva de su autor y no representa necesariamente la

>>>opinion de Interbanking S.A. El acceso no autorizado, uso, 
>>>reproduccion, o divulgacion esta prohibido. Interbanking S.A no 
>>>asumira responsabilidad ni obligacion legal alguna por cualquier 
>>>informacion incorrecta o alterada contenida en este mensaje. Si usted

>>>ha recibido este mensaje por error, le rogamos tenga la amabilidad de

>>>destruirlo inmediatamente junto con todas las copias del mismo, 
>>>notificando al remitente. No debera utilizar, revelar, distribuir, 
>>>imprimir o copiar este mensaje ni ninguna de sus partes si usted no 
>>>es
>
>>>el destinatario. Muchas gracias.
>>>
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>>---
>>Incoming mail is certified Virus Free.
>>Checked by AVG anti-virus system (http://www.grisoft.com).
>>Version: 6.0.459 / Virus Database: 258 - Release Date: 25/02/2003
>>
>>
>>---
>>Outgoing mail is certified Virus Free.
>>Checked by AVG anti-virus system (http://www.grisoft.com).
>>Version: 6.0.459 / Virus Database: 258 - Release Date: 25/02/2003
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>NOTA DE CONFIDENCIALIDAD
>Este mensaje (y sus anexos) es confidencial, esta dirigido 
>exclusivamente a las personas direccionadas en el mail y puede contener

>informacion (i)de propiedad exclusiva de Interbanking S.A. o (ii) 
>amparada por el secreto profesional. Cualquier opinion en el contenido,

>es exclusiva de su autor y no representa necesariamente la opinion de 
>Interbanking S.A. El acceso no autorizado, uso, reproduccion, o 
>divulgacion esta prohibido. Interbanking S.A no asumira responsabilidad

>ni obligacion legal alguna por cualquier informacion incorrecta o 
>alterada contenida en este mensaje. Si usted ha recibido este mensaje 
>por error, le rogamos tenga la amabilidad de destruirlo inmediatamente 
>junto con todas las copias del mismo, notificando al remitente. No 
>debera utilizar, revelar, distribuir, imprimir o copiar este mensaje ni
>ninguna de sus partes si usted no es el destinatario. Muchas gracias.
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>

NOTA DE CONFIDENCIALIDAD
Este mensaje (y sus anexos) es confidencial, esta dirigido exclusivamente a las 
personas direccionadas en el mail y puede contener informacion (i)de propiedad 
exclusiva de Interbanking S.A. o (ii) amparada por el secreto profesional. Cualquier 
opinion en el contenido, es exclusiva de su autor y no representa necesariamente la 
opinion de Interbanking S.A. El acceso no autorizado, uso, reproduccion, o divulgacion 
esta prohibido. Interbanking S.A no asumira responsabilidad ni obligacion legal alguna 
por cualquier informacion incorrecta o alterada contenida en este mensaje. Si usted ha 
recibido este mensaje por error, le rogamos tenga la amabilidad de destruirlo 
inmediatamente junto con todas las copias del mismo, notificando al remitente. No 
debera utilizar, revelar, distribuir, imprimir o copiar este mensaje ni ninguna de sus 
partes si usted no es el destinatario. Muchas gracias.



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to