• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

List boxes

 
Ranch Hand
Posts: 195
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I would like to be able to create list boxes in a JSP page without having to hit the database to load the list box everytime the user goes to that page. So the list would be generated once via SQL when the user first visits the page, and stored somewhere, probably in a collection item, and then could be used probably via a custom tag anywhere in JSP pages.
The criteria that I would like are:
1. easy to create the drop down list
2. can supply criteria so only certain items get added to the list (i.e. all items for a particular person)
3. can add/remove items from the list box easily
4. ordered by the text that is displayed by the list box
5. be able to supply a value that would represent the item that is initally selected in the list box
I was thinking that I could do one database hit when the user visits the site that would load a HashMap of what I would like to display in the list box. However, most list boxes are ordered (like a drop down list for Countries should be alphabetical) and HashMaps you can order by Key, but not by Value (which in this case would be the country name) You can take a HashMap and get a Set view of it using entrySet(), but as far as I can tell that really doesn't help except in iterating through the Map.
By using a Map, it satisfies all other criteria except for the sorting:
-it's easy to add/remove things
-one could supply a value to match against by iterating through the Map (by using the Set view)
-when creating the Map you could specify the criteria for putting items in the Map (where clause of the SQL)
-easy to create
Is there a way to sort the HashMap by the value and not the key? or is there another way that someone has done something similar that satisfies all of the above criteria?
Open to any and all suggestions!
Thanks for your help!
Brian
 
Sheriff
Posts: 7001
6
Eclipse IDE Python C++ Debian Java Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
If I am right in assuming that a dropdown list won't have a very large number of items in it, then it might make sense to sort the elements as they are rendered. I have written and used a simple "SortedEnumeration" class which pops the values into a vector, sorts them and returns an enumeration of the sorted elements, and I'm sure you could do the same. The built in java sorting routines are pretty good for this kind of application.
 
Brian Nice
Ranch Hand
Posts: 195
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
By sorting the values in the vector, how are you able to also keep the value's key associated with it? That's why I had initally thought of using the map since the HTML <INPUT> tag needs a value too. Am I just missing something?
 
Frank Carver
Sheriff
Posts: 7001
6
Eclipse IDE Python C++ Debian Java Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
OK. A few other choices:
First, are these value unique, or can the same value appear more than once with different names (seems odd for a dropdown, but possible)?
If they are unique, why not have your map the other way round with the value as the key, and the name as the value. Do you use the map for any other sort of lookup?
If they are not unique, maybe use a Vector (or ArrayList etc.) of name,value pairs rather than a map, and sort that as appropriate.
If you need the lookup capabilities of the map, and the values are unique, how about having two maps, one name->value and one value->name. It shouldn't take up much more space, as all the keys and values will be shared, but would mean that you could access either sorted by key, sorted by value, direct to named key or direct to named value.
is any of this helpful?
 
Brian Nice
Ranch Hand
Posts: 195
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Reversing how I store information in the HashMap may work- I hadn't thought of that. Is there any kind of problem with using a long string for the map key (like performance issues)? Most of the values I would be storing are descriptions, so it could happen that I have a string of 50+ characters as the key. I guess if that wouldn't matter to the map, then that could work. However, I cannot guarantee that all descriptions would be unique... :-(
I thought about ArrayList, but wasn't sure how that would work since a List allows you store an object at a specific list index, so there is no real way to keep the key associated with the value if the value were the object. And the key may not always be something that could be converted to an integer if the key were to be used as the array index.
How do you keep the values associated with what is displayed when you create HTML lists with your method?
 
Frank Carver
Sheriff
Posts: 7001
6
Eclipse IDE Python C++ Debian Java Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
How about something like:
 
Brian Nice
Ranch Hand
Posts: 195
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I think that will work! Just one correction I think, the getValue(int i) method I think should return getPair(i).value and not getPair(i).name?
Thanks for your help! I've been working on trying to find something flexible to use for the various projects that I am working on. It should be easy now to create a HashMap containing multiple ObjectLists, and then in a JSP page get out the ObjectList that I need from the HashMap, pass it as a parameter to a JSP Custom tag that then creates the drop down lists, with the list being in the correct order!
Thanks again
Brian
 
Greenhorn
Posts: 3
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Frank,
How about using a Treeset class for sorting. Please clarify.
Thanks.
 
Frank Carver
Sheriff
Posts: 7001
6
Eclipse IDE Python C++ Debian Java Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
You could use that. The reason I chose the approach above is that for most uses of an option list, you only need to sort the elements once, after they have all been inserted, but they will be read out of the list lots of times. Therefore it makes sense to limit the "cost" of the sort operation, and use quicker add/get operations while building or reading the list.
TreeSet is very good for collections which change a lot, maybe as often as or more often than they are read, but need to always be sorted. The cost of sorting is spread between both the add and get operations, but there is always an overhead, even if the set has not changed for a long time.
And yes, Brian, you were right about getPair(i).name. That'll teach me to cut-n-paste!
 
Consider Paul's rocket mass heater.
reply
    Bookmark Topic Watch Topic
  • New Topic