V priloze zasilam utilitku kterou jsem si na podobne pripady nedavno
vytvoril.
Volaji se staticke metody sort, urcite poznate jak to funguje, jako
parametr se predava mj.
take cislo sloupce podle ktereho se ma tridit a zpusob, zda vzestupne
nebo obracene.
Melo by to umet tridit obecne jakakoli pole objektu, prip. i Vektor s
prvky typu pole,
ale za nic nerucim.
S pozdravem,
Martin Fiala, ITS, a. s.
P D wrote:
Nevie mi niekto portadit, ako najefektivnejsie utriedit String[][] podla
zadaneho sltpca? Mam tabulku podobnu ako v Exceli a snazim sa utriedit riadky
podla daneho stlpca. V systeme mam okolo 10.000 riadkov a asi 15 stlpcov.
Filip.
Aktivujte si neobmedzenu mailovu schranku na www.pobox.sk!
package cz.its.base.utils;
/**
* Creation date: (3/6/05 11:20:24)
* @author: MF
*/
import cz.its.base.*;
import java.lang.reflect.*;
import java.util.*;
public class Sort implements Comparator {
public static final int
ASC = 0, DESC = 1
;
private int sortOrder = -1, sortColIdx = -1;
private String cmpMethod = null;
/**
* Sort constructor comment
*/
public Sort() {
this(ASC, 0, null);
}
/**
* Sort constructor comment (universal)
*/
public Sort(int sortOrder, int sortColIdx, String cmpMethod) {
setSortOrder(sortOrder);
setSortColIdx(sortColIdx);
setCmpMethod(cmpMethod);
}
/**
* Sort constructor comment (for Object with array elements)
*/
public Sort(int sortOrder, int sortColIdx) {
this(sortOrder, sortColIdx, null);
}
/**
* Sort constructor comment (for other Objects)
*/
public Sort(int sortOrder, String cmpMethod) {
this(sortOrder, 0, cmpMethod);
}
private void setSortOrder(int sortOrder) {
this.sortOrder = sortOrder;
}
private int getSortOrder() {
return sortOrder;
}
private void setSortColIdx(int sortColIdx) {
this.sortColIdx = sortColIdx;
}
private int getSortColIdx() {
return sortColIdx;
}
private void setCmpMethod(String cmpMethod) {
if (cmpMethod == null) cmpMethod = "toString";
this.cmpMethod = cmpMethod;
}
private String getCmpMethod() {
return cmpMethod;
}
/**
* Sort main method (for Object with array elements)
*/
public static void sort(Object[] data, int sortOrder, int sortColIdx) {
Sort sort = new Sort(sortOrder, sortColIdx);
Arrays.sort(data, sort);
}
/**
* Sort main method (for Vectors with array elements)
*/
public static void sort(Vector data, Class elemType, int sortOrder, int
sortColIdx) {
Sort sort = new Sort(sortOrder, sortColIdx);
if (elemType.isArray()) {
Object[] dataO = (Object[])Array.newInstance(elemType,
data.size());
data.copyInto(dataO);
Arrays.sort(dataO, sort);
data.clear();
for (int i=0; i<dataO.length; i++)
data.addElement(dataO[i]);
}
}
/**
* Sort main method (for other Objects)
*/
public static void sort(Object[] data, int sortOrder, String cmpMethod) {
Sort sort = new Sort(sortOrder, cmpMethod);
Arrays.sort(data, sort);
}
public int compare(Object o1, Object o2) {
int ret = 0, ord = getSortOrder(), idx = getSortColIdx();
if (o1 != null && o2 != null) {
/*
if (o1 instanceof String[] && o2 instanceof String[]) {
String[] s1 = (String[])o1, s2 = (String[])o2;
if (idx >= 0 && idx < s1.length && idx < s2.length) {
ret = (ord == ASC ? 1 : -1) *
s1[idx].compareTo(s2[idx]);
if (ret != 0)
System.out.println("s1="+s1[idx]+", s2="+s2[idx]+", ret="+ret);
}
}
else
//*/
{
String cm = getCmpMethod();
try {
Object r1 = null, r2 = null;
if (o1.getClass().isArray() &&
o2.getClass().isArray()) {
if (idx >= 0 && idx <
Array.getLength(o1) && idx < Array.getLength(o2)) {
Object o1a = Array.get(o1,idx);
Object o2a = Array.get(o2,idx);
return compare(o1a, o2a);
}
}
else {
r1 =
o1.getClass().getMethod(cm,null).invoke(o1,null);
r2 =
o2.getClass().getMethod(cm,null).invoke(o2,null);
}
ret = (ord == ASC ? 1 : -1) *
r1.toString().compareTo(r2.toString());
//if (ret != 0) System.out.println("r1="+r1+",
r2="+r2+", ret="+ret);
}
// NoSuchMethodException, InvocationTargetException,
IllegalAccessException
catch (Throwable e) {
Tracer.error(this,"Error in sort:
"+StringUtils.getShortName(e));
Tracer.exc(this,e);
}
}
}
return ret;
}
}