Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.glorb.com!news-out.readnews.com!transit3.readnews.com!news-out.news.tds.net!newsreading01.news.tds.net!53ab2750!not-for-mail From: "Volker Borchert" Subject: Re: verbose sort Message-ID: <501D6350.56102.calajapr@time.synchro.net> X-Comment-To: All Newsgroups: comp.lang.java.programmer X-FTN-AREA: COMP.LANG.JAVA.PROGRAMMER X-FTN-MSGID: 1:261/38 5743dc23 Content-Type: text/plain; charset=IBM437 Content-Transfer-Encoding: 8bit X-Gateway: time.synchro.net [Synchronet 3.16a-Win32 NewsLink 1.98] Lines: 85 Date: Sat, 04 Aug 2012 18:41:38 GMT NNTP-Posting-Host: 69.21.70.65 X-Complaints-To: news@tds.net X-Trace: newsreading01.news.tds.net 1344105698 69.21.70.65 (Sat, 04 Aug 2012 13:41:38 CDT) NNTP-Posting-Date: Sat, 04 Aug 2012 13:41:38 CDT Organization: tds.net Xref: csiph.com comp.lang.java.programmer:17142 From: "Volker Borchert" From: v_borchert@despammed.com (Volker Borchert) Eric Sosman wrote: > To: bob smith > From: Eric Sosman > > On 8/2/2012 11:37 AM, bob smith wrote: > > I have some code that sorts a list like so: > > > > Vector my_list = new Vector(); > > > > > > Comparator c = new Comparator() { > > @Override > > public int compare(String object1, String object2) { > > if (object1 == null) > > return -1; > > if (object2 == null) > > return 1; > > object1 = object1.toLowerCase(); > > object2 = object2.toLowerCase(); > > return object1.compareTo(object2); > > }; > > }; > > > > Collections.sort(my_list, c); > > > > > > This seems like a lot of code for such a common operation. Is there a more > succinct way of doing this? > > Consider using compareToIgnoreCase(). Also, think about what > happens when two null's are compared: You should return zero rather than > declaring one of them "less than" the other, because otherwise your comparator > is inconsistent (you can have A > public int compare(String s1, String s2) { > if (s1 == null) > return s2 == null ? 0 : -1; > return s2 == null ? +1 : s1.compareToIgnoreCase(s2); > } I'd do it as a fastpath and GoF Decorator public final class NullFirstComparator implements Comparator { @NonNull private final Comparator delegate; public NullFirstComparator(@NonNull final Comparator delegate) { this.delegate = delegate; } public int compare(final T t1, final T t2) { if (t1 == t2) { return 0; } else if (t1 == null) { return -1; } else if (t2 == null) { return 1; } else { return delegate.compare(t1, t2); } } } Collections.sort(my_list, new NullFirstComparator(String.CASE_INSENSITI VE_ORDER)); -- "I'm a doctor, not a mechanic." Dr Leonard McCoy "I'm a mechanic, not a doctor." Volker Borchert -+- BBBS/Li6 v4.10 Dada-1 + Origin: Prism bbs (1:261/38) -+- Synchronet 3.16a-Win32 NewsLink 1.98 Time Warp of the Future BBS - telnet://time.synchro.net:24 --- BBBS/Li6 v4.10 Dada-1 * Origin: Prism bbs (1:261/38) --- Synchronet 3.16a-Win32 NewsLink 1.98 Time Warp of the Future BBS - telnet://time.synchro.net:24