Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #16993 > unrolled thread

Re: verbose sort

Started by"Eric Sosman" <eric.sosman@1:261/38.remove-s5y-this>
First post2012-08-02 19:12 +0000
Last post2012-08-02 21:38 +0000
Articles 2 — 2 participants

Back to article view | Back to comp.lang.java.programmer

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  Re: verbose sort "Eric Sosman" <eric.sosman@1:261/38.remove-s5y-this> - 2012-08-02 19:12 +0000
    Re: verbose sort v_borchert@despammed.com (Volker Borchert) - 2012-08-02 21:38 +0000

#16993 — Re: verbose sort

From"Eric Sosman" <eric.sosman@1:261/38.remove-s5y-this>
Date2012-08-02 19:12 +0000
SubjectRe: verbose sort
Message-ID<501AC32E.55955.calajapr@time.synchro.net>
  To: bob smith
From: Eric Sosman <esosman@ieee-dot-org.invalid>

On 8/2/2012 11:37 AM, bob smith wrote:
> I have some code that sorts a list like so:
>
> Vector<String> my_list = new Vector<String>();
>
>
>               Comparator<String> c = new Comparator<String>() {
>                       @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<B, B<C, but C<A).

        public int compare(String s1, String s2) {
            if (s1 == null)
                return s2 == null ? 0 : -1;
            return s2 == null ? +1 : s1.compareToIgnoreCase(s2);
        }

--
Eric Sosman
esosman@ieee-dot-org.invalid

--- 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

[toc] | [next] | [standalone]


#17007

Fromv_borchert@despammed.com (Volker Borchert)
Date2012-08-02 21:38 +0000
Message-ID<jves09$ajt$1@Gaia.teknon.de>
In reply to#16993
Eric Sosman wrote:
>   To: bob smith
> From: Eric Sosman <esosman@ieee-dot-org.invalid>
> 
> On 8/2/2012 11:37 AM, bob smith wrote:
> > I have some code that sorts a list like so:
> >
> > Vector<String> my_list = new Vector<String>();
> >
> >
> >               Comparator<String> c = new Comparator<String>() {
> >                       @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<B, B<C, but C<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<T> implements Comparator<T> {
  @NonNull
  private final Comparator<T> delegate;

  public NullFirstComparator(@NonNull final Comparator<T> 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>(String.CASE_INSENSITIVE_ORDER));

-- 

"I'm a doctor, not a mechanic." Dr Leonard McCoy <mccoy@ncc1701.starfleet.fed>
"I'm a mechanic, not a doctor." Volker Borchert  <v_borchert@despammed.com>

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.java.programmer


csiph-web