webresultssorter.java

来自「esri的ArcGIS Server超级学习模板程序(for java)」· Java 代码 · 共 112 行

JAVA
112
字号
/**
 * 
 */
package com.esri.solutions.jitk.web.data.results;

import java.util.List;

import org.apache.log4j.Logger;

import com.esri.adf.web.data.results.ResultNode;


/**
 * @author vlad2928
 *
 */
public class WebResultsSorter {
	
	private static Logger _logger = Logger.getLogger(WebResultsSorter.class.getName());
	
	private String sortByColumnName = "";
    private boolean sortAscending = true;
    
    public ResultNode sort(ResultNode data, String sortByColumnName, boolean sortAscending) {
		
		this.sortByColumnName = sortByColumnName;
		this.sortAscending = sortAscending;
		
		if(data != null && this.sortByColumnName != null && this.sortByColumnName.length() > 0) {
			try {
				List<ResultNode> rows = data.getChildren();
				if(rows != null && rows.size() > 1) {
					quickSort(rows, 0, rows.size() - 1);
				}
			} catch(Exception e) {
				_logger.warn(e.toString());
			}
		}
		
		return data;
	}
	
	private void quickSort(List<ResultNode> rows, int left, int right) throws ClassCastException {
		int i = left, j = right;
		ResultNode pivotNode = rows.get(new Double(Math.ceil((right+left) / 2)).intValue());
		
		while(true) {
			
			if(!isValidIndex(rows, i) || !isValidIndex(rows, j)) break;
			
			while(isInOrder(rows.get(i), pivotNode)) i++;
			while(isInOrder(pivotNode, rows.get(j))) j--;
			
			if(i <= j) {
				if(!isInOrder(rows.get(i), rows.get(j))) {
					swap(rows, i, j);
				} 
				i++; j--;
				
			} else break;
		}
	    
		if(left < j) {
			quickSort(rows, left, j);
		}
	    
		if(i < right) {
			quickSort(rows, i, right);
		}
	}
	
	@SuppressWarnings("unchecked")
	private boolean isInOrder(ResultNode node1, ResultNode node2) throws ClassCastException {
		
		Object o1 = node1.getDetails().get(sortByColumnName);
		Object o2 = node2.getDetails().get(sortByColumnName);
		
		if(o1 instanceof Comparable && o2 instanceof Comparable) {
			if(sortAscending) {
				return (((Comparable)o1).compareTo((Comparable)o2) < 0);
			} else {
				return (((Comparable)o1).compareTo((Comparable)o2) > 0);
			}	
		}
		
		throw new java.lang.ClassCastException("Objects " + o1.getClass().getName() + " and " + o2.getClass().getName() + " are not comparable.");
	}
	
	private boolean isValidIndex(List<?> list, int i) {
		return (i >= 0 && i < list.size());
	}
	
	private void swap(List<ResultNode> list, int i1, int i2) {
		
		if(i1 != i2 && isValidIndex(list, i1) && isValidIndex(list, i2)) {
			
			ResultNode r1 = list.get(i1);
			ResultNode r2 = list.get(i2);
		
			list.remove(r1);
			list.remove(r2);
			
			list.add(i1, r2);
			list.add(i2, r1);
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?