/* 35 pts Aprendizajes a valorar 3 - Relanza excepción 3 - Apertura de archivo 3 - Extracción de palabras 4 - Incorporación en palabras nuevas en ArrayList, 4 - Aumenta frecuencia de las existentes 11 - Clase para los elementos del ArrayList, detalle: 3 - Atributos privados 3 - Acceso vía métodos 5 - Implementación de interfaz Comparable 3 - Ordena palabras 4 - Impresión de palabras de menor a mayor frecuencia */ import java.io.*; import java.util.*; public class CuentaPalabras { public static void main(String args[]) throws IOException { Scanner inFile= new Scanner (new File(args[0])); ArrayList mapeo = new ArrayList(); inFile.useDelimiter("[^a-zA-ZáéíóúñÑ]+"); while(inFile.hasNext("[a-zA-ZáéíóúñÑ]+")) { boolean encontrada; String newPalabra = inFile.next("[a-zA-ZáéíóúñÑ]+"); encontrada=false; for( ParPalabraFrecuencia par:mapeo) if (par.hasWord(newPalabra)){ par.incremente(); encontrada=true; break; // no exigido } if (!encontrada) mapeo.add(new ParPalabraFrecuencia(newPalabra)); } Collections.sort(mapeo); // Forma 1 de invocar sort, sólo 1 invocación es requerida Collections.sort(mapeo, new ParPalabraFrecuencia("nada")); //Forma 2 de sort for (ParPalabraFrecuencia par: mapeo ) System.out.println(par); inFile.close(); } } class ParPalabraFrecuencia implements Comparable , Comparator { private String palabra; private int frecuencia; public ParPalabraFrecuencia (String p){ palabra = p; frecuencia=1; } public void incremente(){ frecuencia++; } public int compareTo(ParPalabraFrecuencia otra){ //para forma 1 de sort return frecuencia-otra.frecuencia; /* if (frecuencia < otra.frecuencia) return -1; if (frecuencia > otra.frecuencia) return 1; return palabra.compareTo(otra.palabra); // no exigido */ } public int compare(ParPalabraFrecuencia p1, ParPalabraFrecuencia p2) {//para forma 2 return p1.frecuencia - p2.frecuencia; } public boolean hasWord (String p){ return palabra.equals(p); } public String toString (){ return palabra + ": " + frecuencia; } }