Russ Kepler <r...@kepler-eng.com> wrote on 11/08/2012 09:22:41 AM: > From: Russ Kepler <r...@kepler-eng.com> > To: Tomcat Users List <users@tomcat.apache.org>, > Date: 11/08/2012 09:23 AM > Subject: Re: This is just plain ... odd. > > On Thursday, November 08, 2012 01:35:55 PM Lyallex wrote:
> > I have tried everything I can think of to reproduce this behaviour > > in a standalone Java program but the list is always returned > > as required. When I call the method from a servlet the list is always > > returned > > in it's natural order, I know collections.sort is being executed as > > the list is in alpha order, it's almost as if the comparator is being > > replaced in some way > > > > I have no servlet filters or any other code 'in the way' between the facade > > and the initialization servlet. > > > > Any ideas ? > I'm not sure that you can ever get consistent results if the input order is > random. The Collections.sort() implements a merge sort and the merge sort > depends on a consistent result from the compare() method. As implemented the > compare() will return what you want when the object being compared against is > the "Misc" object but return a string compare when it isn't. Try this: > @Override > public int compareTo(Category c) { > if(category.equals("Miscellaneous")){ > return 1; > } elseif (c.category.equals("Miscellaneous")) { > return -1; > else{ > return category.compareTo(c.category); > } > } > (side comment: If the list is a decent size it might make sense to compare > against the Misc object rather than compare all strings but it's likely not > worth the bother). > The was I usually handle this is to .remove the offending object > from the list, > sort, then .add it back on after the sort. Keep the odd code local to the > oddity. This is closer, but still doesn't work correctly if two "Misc" categories are being compared, or one "Misc" category is compared to itself. Try: @Override public int compareTo(Category c) { if(category.equals("Miscellaneous")) { if(category.equals(c.category) return 0; // correctly handle equality. else return 1; } elseif (c.category.equals("Miscellaneous")) { return -1; } else { return category.compareTo(c.category); } } --------------------------------------------------- David S. Johnson DeskNet Inc.