Home | FAQ | Contact me

Java Sorting

Most examples you find of this are too simple and involve only Strings or Integers. Here's little more complex example. It's from some code I wrote to interface to AddressDoctor™, a commercial address verification service.

The important stuff to look at here is the block that begins

    Collections.sort( ...

  // fill the array...
  .
  .
  .

  List< ADAddressDto > suggestedDtos = queryResult.getAddressData();

  /* Sort the suggestions from highest mailability to lowest if asked to do so,
   * or if caller asks us to limit returned DTOs or cut them off based on a
   * mailability threshold.
   *
   * If our caller limits the number of suggestions he wants back, then toss out
   * any extra ones--always keeping those of highest mailability. Then, filter
   * the results even further based on his expression of lowest acceptable
   * mailability.
   */
  boolean sortThem = proposed.sortSuggestions();
  int     keep     = proposed.getMaximumSuggestions();
  int     lowest   = proposed.getMailabilityThreshold();

  if( sortThem || keep > 0 || lowest > 0 )
  {
    Collections.sort( suggestedDtos, new Comparator< ADAddressDto >()
      {
        @Override
        public int compare( ADAddressDto o1, ADAddressDto o2 )
        {
          return ( o1.getMailability() < o2.getMailability() ) ? 1 : -1;
        }
      }
    );

    List< ADAddressDto > results = new ArrayList< ADAddressDto >();

    for( ADAddressDto dto : suggestedDtos )
    {
      if( keep-- <= 0 )
        break;

      results.add( dto );
    }

    queryResult.setAddressData( results );

    if( lowest != 0 )
    {
      // choke up on all that was passed back: it's potentially a shorter list now!
      suggestedDtos = results;

      results = new ArrayList< ADAddressDto >();

      for( ADAddressDto dto : queryResult.getAddressData() )
      {
        if( dto.getMailability() < lowest )
          break;

        results.add( dto );
      }

      queryResult.setAddressData( results );
    }
  }

  return queryResult;
}