On Wednesday 19 December 2007 16:55:05 Jerome Louvel wrote:
> Hi Davide,
>
> This is smart. I wish we could use it in the Directory as well. Two
> issues: - as the code is LGPL or GPL we need to add a dependency to NRE
> and/or Restlet API JARs
> - it may add a performance cost to the rendering of index pages
>
> If someone knows a public domain version or is willing to recode it, then
> I'll happily add this feature. I've entered a RFE:
> http://restlet.tigris.org/issues/show_bug.cgi?id=402
I've written an implementation (in attachment), it is not meant to be
correct nor fast but I think that it could be a good starting point because
it is public domain.
It was inspired by this post:
http://nedbatchelder.com/blog/200712.html#e20071211T054956
--
Best Regards,
-- Davide Angelocola
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
// test data from: http://www.davekoelle.com/alphanum.html
list.add("1000X Radonius Maximus");
list.add("10X Radonius");
list.add("200X Radonius");
list.add("20X Radonius");
list.add("20X Radonius Prime");
list.add("30X Radonius");
list.add("40X Radonius");
list.add("Allegia 50 Clasteron");
list.add("Allegia 500 Clasteron");
list.add("Allegia 51 Clasteron");
list.add("Allegia 51B Clasteron");
list.add("Allegia 52 Clasteron");
list.add("Allegia 60 Clasteron");
list.add("Alpha 100");
list.add("Alpha 2");
list.add("Alpha 200");
list.add("Alpha 2A");
list.add("Alpha 2A-8000");
list.add("Alpha 2A-900");
list.add("Callisto Morphamax");
list.add("Callisto Morphamax 500");
list.add("Callisto Morphamax 5000");
list.add("Callisto Morphamax 600");
list.add("Callisto Morphamax 700");
list.add("Callisto Morphamax 7000");
list.add("Callisto Morphamax 7000 SE");
list.add("Callisto Morphamax 7000 SE2");
list.add("QRS-60 Intrinsia Machine");
list.add("QRS-60F Intrinsia Machine");
list.add("QRS-62 Intrinsia Machine");
list.add("QRS-62F Intrinsia Machine");
list.add("Xiph Xlater 10000");
list.add("Xiph Xlater 2000");
list.add("Xiph Xlater 300");
list.add("Xiph Xlater 40");
list.add("Xiph Xlater 5");
list.add("Xiph Xlater 50");
list.add("Xiph Xlater 500");
list.add("Xiph Xlater 5000");
list.add("Xiph Xlater 58");
Collections.sort(list, new Comparator<String>() {
public int compare(String value, String anotherValue) {
String[] valueTokens = value.replaceAll("(\\d+)", " $1 ").split(" ");
String[] anotherValueTokens = anotherValue.replaceAll("(\\d+)", " $1 ").split(" ");
if (valueTokens.length != anotherValueTokens.length) {
return anotherValueTokens.length - valueTokens.length;
} else {
int compareResult;
for (int i = 0; i < valueTokens.length; i++) {
try {
Integer a = Integer.parseInt(valueTokens[i]);
Integer b = Integer.parseInt(anotherValueTokens[i]);
compareResult = a.compareTo(b);
} catch (NumberFormatException a) {
compareResult = valueTokens[i].compareTo(anotherValueTokens[i]);
}
if (compareResult == 0) {
continue;
} else {
return compareResult;
}
}
return 0;
}
}
});
for (String output : list) {
System.out.println(output);
}
}
}