FAQ
Cover
This is the archive Discourse for the Processing (ALPHA) software.
Please visit the new Processing forum for current information.

   Processing 1.0 _ALPHA_
   Topics & Contributions
   Tools
(Moderator: REAS)
   sorting objects by property
« Previous topic | Next topic »

Pages: 1 
   Author  Topic: sorting objects by property  (Read 850 times)
toxi

WWW
sorting objects by property
« on: May 10th, 2004, 4:46pm »

for my current work project i need to sort arrays of objects by a specific property value, something the default sort() function unfortunately can't do. so below is a "little santa's helper" (and a tiny demo) you can use/misuse to do just that in your own sketches...
 
Code:
// quick sort util class
// based on the standard implementation in Bagel
class SortUtil {
  Object[] items;
  SortUtil(Object[] s) {
    items=s;
  }
  void sort() {
    this.sort(0,items.length-1);
  }
  void sort(int i, int j) {
    int pivotIndex = (i+j)/2;
    swap(pivotIndex, j);
    int k = subsort(i-1, j);
    swap(k, j);
    if ((k-i) > 1) sort(i,k-1);
    if ((j-k) > 1) sort(k+1,j);
  }
 
  int subsort(int left, int right) {
    int pivot = right;
    do {
 while (compare(++left, pivot) < 0);
 while ((right != 0) && (compare(--right, pivot) > 0));
 swap(left, right);
    } while (left < right);
    swap(left, right);
    return left;
  }
 
  void swap(int a, int b) {
    Object temp = items[a];
    items[a] = items[b];
    items[b] = temp;
  }
 
  // this method needs to be overwritten
  // in the derived classes
  // needs to return the following:
  // -1 - if A < B
  //  0 - if A = B
  //  1 - if A > B
  int compare(int a, int b) {
    return 0;
  }
}
 
// a little data type for demo purposes below  
class Dummy {
  int val;
  String letter;
  Dummy(int xx, String l) {
    val=xx;
    letter=l;
  }
}
 
// custom version of the SortUtil class
// to sort objects of the class "Dummy"
// by their "letter" property
class DummySortByLetter extends SortUtil {
  // constructor needs to call the generic one
  // in the super class SortUtil
  DummySortByLetter(Dummy[] e) {
    super((Object[])e);
  }
 
  // custom version of compare method
  //to check 2 values (here 2 strings)
  int compare(int a, int b) {
    Dummy objA=(Dummy)items[a];
    Dummy objB=(Dummy)items[b];
    return objA.letter.compareTo(objB.letter);
  }
}
 
// another custom version of the SortUtil class
// to sort objects of the class "Dummy"
// by their "value" property
class DummySortByValue extends SortUtil {
  DummySortByValue(Dummy[] e) {
    super((Object[])e);
  }
 
  // here we compare the "value" integer
  // properties of the objects
  int compare(int a, int b) {
    Dummy objA=(Dummy)items[a];
    Dummy objB=(Dummy)items[b];
    if (objA.val < objB.val) return -1;
    return (objA.val == objB.val) ? 0 : 1;
  }
}
 
void setup() {
  Dummy[] dummies=new Dummy[4];
  dummies[0]=new Dummy(200,"o");
  dummies[1]=new Dummy(100,"i");
  dummies[2]=new Dummy(-50,"x");
  dummies[3]=new Dummy(20,"t");
   
  // demonstrate alphabetical sorting of the objects,
  // using the "letter" property
  println("sort by letter...");
  DummySortByLetter sortByLetter=new DummySortByLetter(dummies);
  sortByLetter.sort();
  for(int i=0; i<dummies.length; i++) {
    println(dummies[i].letter+" "+dummies[i].val);
  }
 
  // demonstrate numerical sorting,
  // using the int property values
  println("sort by value...");
  DummySortByValue sortByVal=new DummySortByValue(dummies);
  sortByVal.sort();
  for(int i=0; i<dummies.length; i++) {
    println(dummies[i].letter+" "+dummies[i].val);
  }
}
 

http://toxi.co.uk/
TomC

WWW
Re: sorting objects by property
« Reply #1 on: May 10th, 2004, 6:41pm »

Here's a similar thing from my archives.  Implementing the Comparable interface from Java, and using Arrays.sort()
 
Code:

 
class MyThing implements Comparable {
  int value = 0;
  // return 0 if equal, < 0 if less, > 0 if greater
  public int compareTo(Object other) {
    return this.value - ((MyThing)other).value;
  }
  public String toString() {
    return String.valueOf(value);
  }
}
 
MyThing[] stuff;
 
void setup() {
  stuff = new MyThing[12];
  println("before sorting:");
  for (int i = 0; i < stuff.length; i++) {
    stuff[i] = new MyThing();
    stuff[i].value = (int)random(stuff.length);
    println(stuff[i]);
  }
  Arrays.sort(stuff);
  println("after sorting:");
  for (int i = 0; i < stuff.length; i++) {
    println(stuff[i]);
  }
}
 
« Last Edit: May 10th, 2004, 6:42pm by TomC »  
Pages: 1 

« Previous topic | Next topic »