DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Snippets has posted 5883 posts at DZone. View Full User Profile

A Sortable, Ordered Map

09.21.2006
| 9319 views |
  • submit to reddit
        This is a neat collection that allows its elements to be sorted arbitary by moving them up and down in the List or put them to a given index. Nice to display lists that can be edited (i.e. reordered) by the user.

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.collections.map.ListOrderedMap;

/**
 * @author janhoo
 */
public class SortableOrderedMap extends ListOrderedMap {

  /**
   * Inserts a given Key/Value-Pair on a certain Position
   * alle following Pairs are moved up accordingly 
   * 
   * @param newKey
   * @param newValue
   * @param pos
   * @return
   */
  public Object putOnPosition(Object newKey, Object newValue, int pos) {
    Object res = put(newKey, newValue);
    while (indexOf(newKey) > pos) {
      moveUp(newKey);
    }
    return res;
  }

  /**
   * Inserts a given Key/Value Pair before position of a given Key
   * 
   * @param newKey
   * @param newValue
   * @param oldKey
   * @return
   */
  public Object putBefore(Object newKey, Object newValue, Object oldKey) {
    if (!containsKey(oldKey)) {
      return put(newKey, newValue);
    }
    return putOnPosition(newKey, newValue, indexOf(oldKey));
  }

  /**
   * 
   * inserts a given key/value pair after the position of a given key
   * 
   * @param newKey
   * @param newValue
   * @param oldKey
   * @return
   */
  public Object putAfter(Object newKey, Object newValue, Object oldKey) {
    if (!containsKey(oldKey)) {
      return put(newKey, newValue);
    }
    return putOnPosition(newKey, newValue, indexOf(oldKey)+1);
  }
	
  /**
   * moves item with given key up by one step. Does nothing
   * if the item is already on top or not existend.
   * 
   * @param the key of the Item to be moved
   */
  public synchronized void moveUp(Object key) {

    // return if already on top or key not in map	
    if (key.equals(firstKey()) || !containsKey(key)) {
      return;
    }
    int pcur = indexOf(key);

    insertOrder.set(pcur, previousKey(key));
    insertOrder.set(pcur - 1, key);
  }

  /**
   * moves item with given key down by one step. Does nothing
   * if the item is already on bottom or not existend.
   * 
   * @param the key of the Item to be moved
   */
  public synchronized void moveDown(Object key) {
    if (key.equals(lastKey()) || !containsKey(key)) {
      return;
    }
    int pcur = indexOf(key);
    insertOrder.set(pcur, nextKey(key));
    insertOrder.set(pcur + 1, key);
  }

  /* (non-Javadoc)
   * @see org.apache.commons.collections.map.ListOrderedMap#asList()
   */
  public List asList() {
    ArrayList v = new ArrayList();
    for (Iterator it = values().iterator(); it.hasNext();) {
      v.add(it.next());
    }
    return v;
  }

	
  /* (non-Javadoc)
   * @see java.lang.Object#toString()
   */
  public String toString() {
    StringBuffer b = new StringBuffer();
    for (Iterator it = values().iterator(); it.hasNext();) {
      b.append(it.next().toString() + "\n");
    }  
    return b.toString();
  }
}


Attention: this requires the jakarta commons collections