sortowanie ciągów znakowych

0

Mam listę:

List<String> list = new ArrayList<String>();
		
list.add("TEST.AAX.MOE10.TXT");
list.add("TEST.AAX.MOE6.TXT");
list.add("TEST.AAX.MOE3.TXT");
list.add("TEST.AAX.MOE12.TXT");
list.add("TEST.AAX.MOE9.TXT");
list.add("TEST.AAX.MOE1.TXT");

Chcę ją posortować (alfabetycznie), rezultat sortowania jaki oczekuje to:

TEST.AAX.MOE1.TXT
TEST.AAX.MOE3.TXT
TEST.AAX.MOE6.TXT
TEST.AAX.MOE9.TXT
TEST.AAX.MOE10.TXT
TEST.AAX.MOE12.TXT

Próbowałem na różne sposoby, ostatni na jaki się skusiłem to GUAVA (http://code.google.com/p/guava-libraries/):

private static Comparator<String> stringAlphabeticalComparator = new Comparator<String>() {
        public int compare(String str1, String str2) {
            return ComparisonChain.start().
                                compare(str1,str2, String.CASE_INSENSITIVE_ORDER).
                                compare(str1,str2).
                                result();
         }
 };

Wywołanie:

System.out.println("------ przed sortowaniem -----");
System.out.println(list.toString());
		
System.out.println("------ po sortowaniu -----");
		
Collections.sort(list, stringAlphabeticalComparator);
System.out.println(list.toString());

I wynik wywołania:
------ przed sortowaniem -----
[TEST.AAX.MOE10.TXT, TEST.AAX.MOE6.TXT, TEST.AAX.MOE3.TXT, TEST.AAX.MOE12.TXT, TEST.AAX.MOE9.TXT, TEST.AAX.MOE1.TXT]
------ po sortowaniu -----
[TEST.AAX.MOE1.TXT, TEST.AAX.MOE10.TXT, TEST.AAX.MOE12.TXT, TEST.AAX.MOE3.TXT, TEST.AAX.MOE6.TXT, TEST.AAX.MOE9.TXT]

Jest ktoś w stanie powiedzieć jak uzyskać wynik jakiego oczekuję?

0

Nie wiem czy to najlepsze rozwiązanie, ale ja to bym posortował to za pomocą Collections.sort() przekazując własny komparator:

import java.util.*;

public class Sort {
	public static void main(String args[]) {
		List<String> list = new ArrayList<String>();
		 
		list.add("TEST.AAX.MOE10.TXT");
		list.add("TEST.AAX.MOE6.TXT");
		list.add("TEST.AAX.MOE3.TXT");
		list.add("TEST.AAX.MOE12.TXT");
		list.add("TEST.AAX.MOE9.TXT");
		list.add("TEST.AAX.MOE1.TXT");
		
		Collections.sort(list, new Sortowanie());
		System.out.println(list);
		
	}
	

}

class Sortowanie implements Comparator<String> {
	
	public int compare(String o1, String o2) {
		int sub1 = Integer.parseInt(o1.substring(12, o1.lastIndexOf('.')));
		int sub2 = Integer.parseInt(o2.substring(12, o2.lastIndexOf('.')));
		if(sub1 < sub2) {
			return -1;
		} else if(sub1 > sub2 ) {
			return 1;
		}
		return 0;
	}
	
}

 
0

@mtw ten komparator zadziała jeśli liczba będzie w określonym miejscu, a ciąg znaków ją poprzedzający będzie taki sam. I tu rodzi się także pytanie do autora czy może wystąpić w stringu więcej niż jedna liczba oraz czy liczba może być ujemna?

podpowiedź na szybko ;) :
użyj wyrażeń regularnych w komparatorze

 
        Pattern p = Pattern.compile("-?\\d+");
        Matcher m1 = p.matcher(o1);
        Matcher m2 = p.matcher(o2);

następnie znajdz pozycje na której zaczyna i konczy sie liczba przy pomocy

 
        m1.find();
        int start1 =m1.start();
        m2.find();
        int start2 =m2.start();
        int end2 =m2.end();
        String number1 = m1.group(); //pobiera liczbe w postaci stringowej

wykorzystaj dodatkowo substring na o1, o2 i napisz poprawny komparator ;)

1

to się nazywa "natural sort" albo sortowanie leksykograficzne.
http://www.java2s.com/Code/Java/Collections-Data-Structure/NaturalOrderComparator.htm

0

Niestety nie jest tak kolorowo, tak jak poprzednik sugeruje, pliki mogą nazywać się różnie, możliwe kombinacje (pomieszane i trzeba je posortować względem każdy do każdego):

TEST46.3.TXT
TEST46.1.TXT
TEST47.4.TXT

TEST47.MOE4.TXT
TEST47.MOE1.TXT

TEST46.AAX.MOE10.TXT
TEST46.AAX.MOE6.TXT
TEST46.AAX.MOE3.TXT
TEST47.AAX.MOE12.TXT
TEST46.AAX.MOE9.TXT
TEST46.AAX.MOE1.TXT

0
ŁF napisał(a):

to się nazywa "natural sort" albo sortowanie leksykograficzne.
http://www.java2s.com/Code/Java/Collections-Data-Structure/NaturalOrderComparator.htm

Czegoś takiego potrzebowałem - dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1