/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* AdressComparator.java
*
* Created on 20. Oktober 2005, 13:51
*
* To change this template, choose Tools | Options and locate the template under
* the Source Creation and Management node. Right-click the template and choose
* Open. You can then make changes to the template in the Source Editor.
*/
package Sirius.util;
import Sirius.server.middleware.types.Node;
import java.math.BigInteger;
import java.util.*;
import java.util.regex.*;
/**
* Der Comparator splitet strings und benutzt als Delimiter ganze Zahlen. Beim Splitten beh\u00E4lt er die delimiter bei
* und vergleicht dann jedes element des splitergebnisses
*
* @author schlob
* @version $Revision$, $Date$
*/
public class NodeComparator implements java.util.Comparator {
//~ Static fields/initializers ---------------------------------------------
// ganze Zahl
static Pattern p = Pattern.compile("[0-9]+"); // NOI18N
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of AdressComparator.
*/
public NodeComparator() {
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param o1 DOCUMENT ME!
* @param o2 DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public int compare(final Object o1, final Object o2) {
String o1String = o1.toString();
String o2String = o2.toString();
if ((o1 instanceof Node) && (o2 instanceof Node)) {
o1String = ((Node)o1).getName();
o2String = ((Node)o2).getName();
}
if (o1String == null) {
o1String = ""; // NOI18N
}
if (o2String == null) {
o2String = ""; // NOI18N
}
int balance = 0;
if (o1String.equals(o2String)) { // beide sind gleich zur\u00FCck 0
return balance;
} else if (o1String.indexOf(o2String) > -1) { // der eine ist ein Substring des anderen
return 1;
} else if (o2String.indexOf(o1String) > -1) {
return -1;
} else {
final Object[] o1s = split(o1String, 0);
// maximal gleiche l\u00E4nge beim vergleich
final Object[] o2s = split(o2String, o1s.length);
for (int i = 0; i < o2s.length; i++) {
if (o1s[i] instanceof java.math.BigInteger /*&& o2s[i] instanceof java.math.BigInteger*/) {
balance = ((BigInteger)o1s[i]).compareTo((BigInteger)o2s[i]);
} else if (o1s[i] instanceof java.lang.String) {
balance = ((String)o1s[i]).compareTo(o2s[i].toString());
}
if (balance != 0) {
return balance;
}
}
return balance;
}
}
/**
* this works like the standard split method except that it keeps the delimiter.
*
* @param input DOCUMENT ME!
* @param limit DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static Object[] split(final CharSequence input, final int limit) {
int index = 0;
final boolean matchLimited = limit > 0;
final ArrayList matchList = new ArrayList();
// p is static
final Matcher m = p.matcher(input);
// Add segments before each match found
while (m.find()) {
if (!matchLimited || (matchList.size() < (limit - 1))) {
final String match = input.subSequence(index, m.start()).toString();
matchList.add(match);
// add splitcharacter
final String delimiter = input.subSequence(m.start(), m.end()).toString();
matchList.add(new BigInteger(delimiter));
index = m.end();
} else if (matchList.size() == (limit - 1)) { // last one
final String match = input.subSequence(index, input.length()).toString();
matchList.add(match);
index = m.end();
}
}
// If no match was found, return this
if (index == 0) {
return new String[] { input.toString() };
}
// Add remaining segment
if (!matchLimited || (matchList.size() < limit)) {
matchList.add(input.subSequence(index, input.length()).toString());
}
// Construct result
int resultSize = matchList.size();
if (limit == 0) {
while ((resultSize > 0) && matchList.get(resultSize - 1).equals("")) { // NOI18N
resultSize--;
}
}
final Object[] result = new Object[resultSize];
return (Object[])matchList.subList(0, resultSize).toArray(result);
}
/**
* DOCUMENT ME!
*
* @param args DOCUMENT ME!
*/
public static void main(final String[] args) {
final String s = "Flurst\u00FCck: 218 / 2"; // NOI18N
final String s2 = "Flurst\u00FCck: 218 / 11"; // NOI18N
System.out.println("STringcompare:: " + s.compareTo(s2)); // NOI18N
final Object[] as = split(s, 0);
for (int i = 0; i < as.length; i++) {
System.out.println(as[i]);
}
final Comparator c = new NodeComparator();
System.out.println("nodecompare " + c.compare(s, s2)); // NOI18N
}
}