2012-08-26 12 views
5

(No se requiere ningún conocimiento de red. Esto es puramente Cadena y Listas).Java: clasificación complicada de cadenas prefijadas (ArrayLists)

Digamos que tengo una función en su lugar, una que acepta una lista de direcciones con puntos de String IPv4, y las ordena en orden ascendente. (No alfabético, clasificación de formato largo de IP verdadero). Vamos a llamar a esto:

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

Esta función ya funciona correctamente. Dada una entrada:

192.168.1.1, 8.8.8.8, 4.5.6.7, 244.244.244.244, 146.144.111.6 

Será salida de la lista:.

4.5.6.7, 8.8.8.8, 146.144.111.6, 192.168.1.1, 244.244.244.244 

(No entremos en un debate sobre si se debe modificar la lista en su lugar o devolver una nueva lista simplemente devuelve una . nueva lista Además, la función no puede ser modificado debido a las numerosas razones)


sin embargo, mi lista de entrada tiene el siguiente aspecto:.

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

Cuando elimino los prefijos (solo uno de e o f, NO NECESARIAMENTE alternan) y creo una matriz limpia para pasar a la función de clasificación, pierdo la información del prefijo. Lo que me gustaría es una salida del tipo:

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

Básicamente, antes de la clasificación, cualquiera que sea el prefijo estaba presente en cada elemento de la lista sin clasificar, el mismo prefijo necesita ser añadido de nuevo a los elementos en el ordenado lista.

Advertencias:

Dirección
  • Un IP puede repetir en la lista original, un máximo de dos veces
  • Cuando se repite dos veces, cada uno de los dos elementos tendrá el mismo prefijo, garantizado
  • Ordenando algoritmo no eliminará duplicados.

Un poco de ayuda algorítmica por favor? (Recuerde, ya tenemos una función que puede ordenar listas de arreglos de cadenas IPv4 limpias).

+0

¿Estás diciendo que quiere tratar 'sortListOfIpv4s' como un cuadro negro? No puedes cambiarlo? –

+0

Precisamente. Entorno de equipo, equipo grande, y es una función de biblioteca no modificada para cada caso de uso único. –

Respuesta

2

No elimine los prefijos antes de pasarlos a la función de clasificación. En su lugar, en el método sortListOfIpv4s, compare siempre Cadenas usando s.substring(1), que le dará la cadena completa sin el prefijo, y agregue s a la matriz ordenada resultante.

Si sortListOfIpv4s es un cuadro negro y que están obligados a pasar las cadenas sin prefijo, entonces se podría almacenar en caché los prefijos de antemano en un Map de 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)); 
} 

A continuación, clasificar y recuperar los prefijos del Map:

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

Desafortunadamente, eso no es posible. Es una función de biblioteca y otros desarrolladores la están utilizando en gran medida. Sería muy criticado si exigiera que se modifique para este escenario en particular. Entonces tengo que hacer una función de envoltura a su alrededor. –

+0

No. Ya he mencionado bajo ciertas precauciones que si una IP se repite dos veces, en la lista original sin clasificar, se garantiza que ambas tengan el mismo prefijo. –

+0

@ refactor.me: Ok, entonces puede almacenar en caché los prefijos antes de ordenar la lista, y recuperarlos más tarde desde el mapa en caché. Ver mi respuesta actualizada. –

0

Su método podría mover cualquier prefijo al final de la cadena, ordenar la lista, y luego ir a través de las cadenas de nuevo y mover los prefijos desde el final de nuevo al inicio.

+0

Eso haría el trabajo, pero sería bastante feo. Es bastante fácil implementar una clasificación personalizada que pueda manejar el prefijo en java, en lugar de mover el prefijo de la ecuación. –

0

Se podría aplicar Comparador:

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

A continuación, se puede usar:

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

Hah, la misma idea :-) –

Cuestiones relacionadas