2012-08-26 16 views
5

(Nessuna conoscenza di rete richiesta di sorta, si tratta puramente di stringhe ed elenchi).Java: ordinamento ingannevole di stringhe con prefisso (ArrayLists)

Dire che ho una funzione sul posto, una che accetta un elenco di indirizzo punteggiato IPv4 String e li ordina in ordine crescente. (Non alfabetico, vero ordinamento lungo formato ip). Chiamiamo questo:

public static ArrayList<String> sortListOfIpv4s(ArrayList<String> unsortedIPv4s); 

Questa funzione è già correttamente. Dato un ingresso:

192.168.1.1, 8.8.8.8, 4.5.6.7, 244.244.244.244, 146.144.111.6 

Sarà uscita la lista:.

4.5.6.7, 8.8.8.8, 146.144.111.6, 192.168.1.1, 244.244.244.244 

(Cerchiamo di non entrare in un dibattito sulla questione se si debba modificare l'elenco sul posto o restituire un nuovo elenco restituisce solo un . nuovo elenco Inoltre, la funzione non può essere modificata a causa di numerosi motivi)


Tuttavia, la mia lista di input assomiglia a questo:.

Quando rimuovo i prefissi (solo uno di eof, NON NECESSARIAMENTE alternante) e creo un array pulito per passare alla funzione di ordinamento, perdo le informazioni del prefisso. Quello che vorrei è un'uscita del tipo:

e4.5.6.7, f8.8.8.8, e146.144.111.6, e192.168.1.1, f244.244.244.244 

Fondamentalmente, prima di smistamento, qualsiasi prefisso era presente per ogni elemento della lista indifferenziati, lo stesso prefisso necessario aggiungere indietro agli elementi nella filtrate elenco.

Avvertenze:

Indirizzo
  • Un IP può ripetere nella lista originale, un massimo di due volte
  • Se si ripete due volte, ciascuno dei due elementi avranno lo stesso prefisso, garantite
  • Ordinamento l'algoritmo non rimuoverà i duplicati.

Un piccolo aiuto algoritmico per favore? (Ricorda, abbiamo già una funzione in grado di ordinare gli array di stringhe IPv4 puliti).

+0

Stai dicendo che desidera trattare 'sortListOfIpv4s' come una scatola nera? Non ti è permesso cambiarlo? –

+0

Precisamente. Ambiente di squadra, team di grandi dimensioni ed è una funzione di libreria non destinata a essere modificata per ogni caso d'uso unico. –

risposta

2

Non rimuovere i prefissi prima di passarlo alla funzione di ordinamento. Invece, nel metodo sortListOfIpv4s, confrontare sempre le stringhe usando s.substring(1), che fornirà l'intera stringa senza il prefisso e aggiungere s alla matrice ordinata risultante.

Se sortListOfIpv4s è una scatola nerae si sono tenuti a superare le stringhe senza prefisso, allora si potrebbe memorizzare nella cache i prefissi prima in un Map da prefix-free IP -> prefix:

Map<String, String> prefixMap = new HashMap<String, String>(); 
for (String ip : unsortedIPv4s) { 
    prefixMap.put(ip.substring(1), ip.substring(0, 1)); 
} 

quindi ordinare e recuperare i prefissi dal Map:

List<String> sortedIPV4s = sortListOfIpv4s(unsortedIPv4s); 
for (String ip : sortedIPV4s) { 
    String prefix = prefixMap.get(ip); 
    String originalIp = prefix + ip; 
} 
+0

Sfortunatamente, questo non è possibile. È una funzione di libreria ed è utilizzata pesantemente da altri sviluppatori. Sarebbe stato affrontato un sacco di critiche se avessi chiesto che fosse modificato per questo particolare scenario. Quindi devo fare una funzione wrapper attorno ad esso. –

+0

No. Ho già menzionato sotto avvertimenti che se un IP si ripete due volte, nella lista originale non ordinata, allora entrambi sono garantiti per avere lo stesso prefisso. –

+0

@ refactor.me: Ok, quindi è possibile memorizzare i prefissi nella cache prima di ordinare l'elenco e recuperarli in seguito dalla mappa memorizzata nella cache. Vedi la mia risposta aggiornata. –

0

Il metodo può spostare qualsiasi prefisso alla fine della stringa, ordinare l'elenco e quindi ripetere nuovamente le stringhe e spostare i prefissi dall'inizio alla fine.

+0

Quello farebbe il lavoro, ma sarebbe piuttosto brutto. È piuttosto facile implementare un ordinamento personalizzato che può occuparsi del prefisso in java, piuttosto che spostare il prefisso fuori dall'equazione. –

0

Si potrebbe implementare comparatore:

public class IpComparator implements Comparator<String> { 
    @Override 
    public int compare(String ipA, String ipB) { 
     return doComparison(ipA.substring(1), ipB.substring(1)); 
    } 
} 

Quindi si può utilizzare:

return Collections.sort(unsortedIPv4s, new IpComparator()); 
+0

Hah, stessa idea :-) –