Advertisement
Guest User

Is it faster to add to a collection then sort it, or add to a sorted collection?

a guest
Aug 31st, 2010
1,000
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 4.99 KB | None | 0 0
  1. /* see http://stackoverflow.com/questions/3607593/is-it-faster-to-add-to-a-collection-then-sort-it-or-add-to-a-sorted-collection */
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Collection;
  6. import java.util.Collections;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Random;
  11. import java.util.TreeSet;
  12.  
  13. import org.apache.commons.lang.builder.CompareToBuilder;
  14. import org.apache.commons.lang.builder.EqualsBuilder;
  15. import org.apache.commons.lang.builder.HashCodeBuilder;
  16.  
  17. public class SortingTest{
  18.  
  19.     public static class Thingy implements Comparable<Thingy>{
  20.  
  21.         public Thingy(final double part1, final double part2, final double part3){
  22.             this.part1 = part1;
  23.             this.part2 = part2;
  24.             this.part3 = part3;
  25.         }
  26.  
  27.         /**
  28.          * {@inheritDoc}
  29.          */
  30.         @Override
  31.         public int hashCode(){
  32.             return new HashCodeBuilder() //
  33.             .append(this.part1)
  34.                 .append(this.part2)
  35.                 .append(this.part3)
  36.                 .toHashCode();
  37.         }
  38.  
  39.         /**
  40.          * {@inheritDoc}
  41.          */
  42.         @Override
  43.         public boolean equals(final Object obj){
  44.             boolean result;
  45.             if(obj instanceof Thingy){
  46.                 final Thingy other = (Thingy) obj;
  47.                 result = new EqualsBuilder() //
  48.                 .append(this.part1, other.part1)
  49.                     .append(this.part2, other.part2)
  50.                     .append(this.part3, other.part3)
  51.                     .isEquals();
  52.             } else{
  53.                 result = false;
  54.             }
  55.             return result;
  56.         }
  57.  
  58.         private final double part1;
  59.  
  60.         private final double part2;
  61.  
  62.         private final double part3;
  63.  
  64.         @Override
  65.         public int compareTo(final Thingy other){
  66.  
  67.             return
  68.  
  69.             new CompareToBuilder().append(calcComp(this), calcComp(other))
  70.                 .toComparison();
  71.         }
  72.  
  73.         private static double calcComp(final Thingy th){
  74.             return Math.pow(th.part1 * th.part3, th.part2);
  75.         }
  76.     }
  77.  
  78.     public interface Transformer<T extends Comparable<T>> {
  79.  
  80.         String identifier();
  81.  
  82.         Collection<T> sort(Collection<T> data);
  83.     }
  84.  
  85.     public static class ArrayListTransformer<T extends Comparable<T>>
  86.         implements Transformer<T>{
  87.  
  88.         @Override
  89.         public Collection<T> sort(final Collection<T> data){
  90.             final List<T> list = new ArrayList<T>(data);
  91.             Collections.sort(list);
  92.             return list;
  93.         }
  94.  
  95.         @Override
  96.         public String identifier(){
  97.             return "ArrayListTransformer";
  98.         }
  99.     }
  100.  
  101.     public static class TreeSetTransformer<T extends Comparable<T>> implements
  102.         Transformer<T>{
  103.  
  104.         @Override
  105.         public Collection<T> sort(final Collection<T> data){
  106.             return new TreeSet<T>(data);
  107.         }
  108.  
  109.         @Override
  110.         public String identifier(){
  111.             return "TreeSetTransformer";
  112.         }
  113.     }
  114.  
  115.     public static class BestOfBothWorldsTransformer<T extends Comparable<T>>
  116.         implements Transformer<T>{
  117.  
  118.         @Override
  119.         public Collection<T> sort(final Collection<T> data){
  120.             return new ArrayList<T>(new TreeSet<T>(data));
  121.         }
  122.  
  123.         @Override
  124.         public String identifier(){
  125.             return "BestOfBothWorldsTransformer";
  126.         }
  127.     }
  128.  
  129.     public static void main(final String[] args){
  130.         final Map<String, Thingy> map = new HashMap<String, Thingy>();
  131.         final Random rnd = new Random();
  132.         for(int i = 0; i < 10000; i++){
  133.             final double a = rnd.nextDouble();
  134.             final double b = rnd.nextDouble();
  135.             final double c = rnd.nextDouble();
  136.             map.put("" + a + b + c, new Thingy(a, b, c));
  137.         }
  138.  
  139.         final List<Transformer<Thingy>> transformers =
  140.             Arrays.asList(new ArrayListTransformer<Thingy>(),
  141.                 new TreeSetTransformer<Thingy>(),
  142.                 new BestOfBothWorldsTransformer<Thingy>());
  143.  
  144.         final Collection<Thingy> thingies = map.values();
  145.         for(final Transformer<Thingy> transformer : transformers){
  146.             final long before1 = System.nanoTime();
  147.             final Collection<Thingy> sorted = transformer.sort(thingies);
  148.             final long after1 = System.nanoTime();
  149.             for(final Thingy thingy : sorted){
  150.             }
  151.             ;
  152.             final long after2 = System.nanoTime();
  153.             System.out.println("Transformer " + transformer.identifier()
  154.                 + "\n\tCreation: " + format(after1 - before1)
  155.                 + " \n\tIteration: " + format(after2 - after1)
  156.                 + " \n\tItem count: " + sorted.size());
  157.         }
  158.  
  159.     }
  160.  
  161.     private static String format(final long nanoseconds){
  162.         return "" + nanoseconds + " ns (" + (double) nanoseconds / 1000000000
  163.             + " seconds)";
  164.     }
  165.  
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement