Ordinamento alfabetico personalizzato di array in Java

1

Ho il requisito di leggere un file di testo con le righe nel formato tag = value e quindi di emettere il file con tag specifici elencati per primi e il resto in ordine alfabetico. Il file in arrivo viene ordinato in modo casuale con l'eccezione della prima riga. L'output richiede che le prime due righe siano sempre le stesse. Ad esempio, dati i seguenti tag:

NAME
AGE
SSN
MARITAL_STATUS
NO_OF_DEPENDENTS

L'input avrà sempre prima NAME e i tag rimanenti (ce ne sono letteralmente centinaia) ordinati in modo casuale. L'output deve avere prima SSN e NAME secondo e il resto ordinato in ordine alfabetico, quindi vorrei finire con:

SSN
NAME
AGE
MARITAL_STATUS
NO_OF_DEPENDENTS  

Nota: questi sono solo esempi di tag. Il file attuale ha 13 campi che devono essere elencati per primi e le rimanenti poche centinaia in ordine alfabetico.

Sto cercando di capire il modo migliore per fare l'ordinamento. In questo momento il mio piano è di leggere le righe nel file in arrivo e metterle in ordine di marcia in due oggetti List. Il primo conterrà i tag specifici che devono essere posizionati per primi e il secondo avrà tutto il resto. Quindi ordinerò la seconda lista e la fonderò nella prima lista. Questo sembra complicato e mi sento come se mi mancasse un approccio più semplice o più elegante.

    
posta Pablo Vadear 02.05.2013 - 22:18
fonte

1 risposta

1

I dati che sono presenti più strettamente assomigliano a una mappa di intestazione a resto di valore. Questo dovrebbe puntare uno in direzione di un Map piuttosto che un List .

Dei dati presentati, ci sono due raggruppamenti di dati: i primi 13 campi e tutto il resto. La presentazione di tutto il resto deve essere utilizzata in un ordine ordinato. Per questo, uno guarda l'interfaccia SortedMap e vede TreeMap come uno se le sue implementazioni.

I 13 dati di campo possono essere utilizzati come un tipo di mappa poco conosciuto: EnumMap .

Con EnumMap , per prima cosa si definiscono le enumerazioni dei campi nell'ordine desiderato.

public enum Headers {
    SSN,
    NAME;
}

Si ottiene quindi il codice associato che assomiglia a qualcosa (senza il loop sui dati):

SortedMap<String, String> other = new TreeMap<String, String>();
EnumMap<Headers, String> headers = new EnumMap<Headers, String>(Headers.class);
try {
    headers.put(Headers.valueOf(key), value);
} catch (IllegalArgumentException  e) {
    other.put(key, value);
}

Se l'intestazione è presente nell'enum, inseriscila nella mappa headers , altrimenti inseriscila nella mappa other .

A questo punto, si può quindi iterare su headers EnumMap e poi su other TreeMap stampare le coppie chiave e valore. Oppure presenta un nuovo oggetto che estende se stesso Iterable e crea un iterator che percorre prima EnumMap e poi SortedMap.

Il enum fornisce una facile estensibilità del codice (se si desidera eseguire il controllo della validazione, è possibile associarlo all'enumerazione.Vedere il tutorial Java su Tipi di Enum per vedere altre cose che si possono fare con esso (associare un metodo con l'enum stesso, valori associati ( Pattern ? un'istanza di una classe che ha un'interfaccia che fornisce un boolean validate(String arg) ? visualizza il codice di formattazione?) per estenderlo ulteriormente.

    
risposta data 03.05.2013 - 01:35
fonte

Leggi altre domande sui tag