2013-05-07 24 views
8

Desidero che i file siano ordinati in base al nome del percorso abs, ma voglio che il minuscolo sia ordinato prima della maiuscola. Esempio: Diciamo che ho avuto 4 file:Java come ordinare le lettere minuscole prima delle stringhe maiuscole

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

l'ordine con questo codice è: [A, B, a, b] voglio che sia: [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

dovrebbe "k.txt" essere inferiore " G.txt "? –

+0

È limitato al set di caratteri Latin/Rnglish? –

+1

Se il nome contiene caratteri maiuscoli e caratteri minuscoli in caratteri maiuscoli? esempio AaAa.txt e aAAA.txt? quale dovrebbe essere il primo? – Madthew

risposta

6

Verificare the Collator class.

Dovrai leggere attentamente cosa significano queste costanti, ma una di queste dovrebbe consentire di inserire lettere minuscole prima delle lettere maiuscole.

1

È possibile implementare il proprio Comparator, che a sua volta utilizza uno Collator. Vedi example.

1

È possibile utilizzare la libreria o le classi di utilità con questo comportamento oppure è possibile creare il proprio comparatore.

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

questo comparatore ordinerà [a, b, A, B]. Voglio [a, A, b, B] – Kuyo

+0

Questo non era molto chiaro, dalla tua domanda originale, ma poi il codice diventa molto più semplice. Inoltre, probabilmente è possibile utilizzare funzioni di libreria come quella fornita da Igor. Codice aggiornato – dtech

0

Prova questa semplice implementazione:

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

Come suggerito da altri, Collator fa ciò che si vuole. Scrivendo una di quelle regole Collator sembrava un po 'paura, ma sembra che l'inglese Collator standard di fa esattamente ciò che si vuole:

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

dà:

[a, A, b, B] 
Problemi correlati