2013-05-07 10 views
8

Chcę, aby pliki były uporządkowane według ich nazwy abs, ale chcę, aby małe litery były sortowane przed wielką literą. Przykład: Załóżmy, że mam 4 pliki:Java, jak sortować małe litery przed dużymi ciągami znaków

files2.add("b"); 
files2.add("A"); 
files2.add("a"); 
files2.add("B"); 

porządek z tym kodem jest: [A, B, A, B] chcę go mieć: [A, A, B, B]

import java.io.File; 
import java.util.*; 

public class Abs { 

    public ArrayList<File> getOrder(ArrayList<File> files) { 
     Collections.sort(files, new Comparator<File>() { 
      public int compare(File file1, File file2) { 
       return file1.getAbsolutePath().compareTo(file2.getAbsolutePath()); 
      } 
     }); 
     return files; 
    } 

} 
+3

Gdyby „k.txt” mniejszy niż " G.txt "? –

+0

Czy jest to ograniczone do zestawu znaków Latin/Rnglish? –

+1

Jeśli wymieniasz wielkie i małe litery? przykład AaAa.txt i aAAA.txt? który powinien być pierwszy? – Madthew

Odpowiedz

6

Sprawdź the Collator class.

Musisz uważnie przeczytać, co oznaczają te stałe, ale jedna z nich powinna umożliwiać pisanie małych liter przed dużymi literami.

1

Można wdrożyć własny Comparator, który z kolei używa Collator. Zobacz example.

1

Prawdopodobnie można użyć klas biblioteki lub narzędzi z tym zachowaniem, lub można zbudować własny komparator.

new Comparator<File>() { 
     public int compare(File file1, File file2) { 
      // Case-insensitive check 
      int comp = file1.getAbsolutePath().compareToIgnoreCase(file2.getAbsolutePath()) 
      // If case-insensitive different, no need to check case 
      if(comp != 0) { 
       return comp; 
      } 
      // Case-insensitive the same, check with case but inverse sign so upper-case comes after lower-case 
      return (-file1.getAbsolutePath().compareTo(file2.getAbsolutePath())); 
     } 
    } 
+0

ten komparator będzie sortował [a, b, A, B]. Chcę [a, A, b, B] – Kuyo

+0

To nie było bardzo jasne, z twojego pierwotnego pytania, ale wtedy kod staje się znacznie prostszy. Również wtedy prawdopodobnie będziesz mógł korzystać z funkcji bibliotecznych, takich jak ta, którą dostarczył Igor. Zaktualizowany kod – dtech

0

Spróbuj prostą implementację:

public static void main(String[] args) { 
      List<String> list = new ArrayList<String>(); 
      list.add("a"); 
      list.add("b"); 
      list.add("A"); 
      list.add("B"); 
      System.out.println(list); 
      Collections.sort(list, new Comparator<String>() { 
        @Override 
        public int compare(String o1, String o2) { 
          if (o1.toLowerCase().equals(o2.toLowerCase())) { 
            if (o1.toLowerCase().equals(o1)) { 
              return -1; 
            } else { 
              return 1; 
            } 
          } else { 
            return o1.toLowerCase().compareTo(o2.toLowerCase()); 

          } 
        } 
      }); 
      System.out.println(list); 
    } 
1

Jak sugeruje innym, Collator robi to, co chcesz. Pisząc jedną z tych zasad Zbieraczka wyglądało to trochę przerażające, ale wygląda na to średnia angielski Collator robi dokładnie to, co chcesz:

public static void main(String... args) 
{ 
    List<String> items = Arrays.asList("b", "A", "a", "B"); 
    Collections.sort(items, Collator.getInstance(Locale.ENGLISH)); 
    System.out.println(items); 
} 

daje:

[a, A, b, B] 
Powiązane problemy