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);
        }
    }
}

Reply via email to