Septiembre | Octubre | Noviembre | Diciembre | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
A list of all content pages in the The Java™ Tutorials
package swingyconcurrencia; public class SwingYConcurrenciaDemo { public static void main(String args[]) { DobleConsola f=new DobleConsola(); f.setVisible(true); ListaNumeros l1=new ListaNumeros(f,1); ListaNumeros l2=new ListaNumeros(f,2); l1.start(); l2.start(); } } class ListaNumeros extends Thread { DobleConsola dc; int n; ListaNumeros(DobleConsola dc, int n){ this.dc=dc; this.n=n; } @Override public void run(){ for (int i=1; i<1000000; i++) { if (n==1) dc.appendArea1(i+"\n"); else dc.appendArea2(i+"\n"); try { sleep((int)(Math.random()*n*400)); } catch (InterruptedException ex) { //TODO Excepción ignorada peligrosamente } } } }donde "DobleConsola" es un JFrame con dos TextAreas y el añadido de dos métodos que son:
void appendArea1(String s){ jTextArea1.append(s); jTextArea1.setCaretPosition(jTextArea1.getText().length()); } void appendArea2(String s){ jTextArea2.append(s); jTextArea2.setCaretPosition(jTextArea2.getText().length()); }(no se tome este código como un ejemplo de otra cosa de lo que se pretende. Puede hacerse algo con más fundamento en varios sentidos)
Collection<?>
: no se puede añadir nada a una colección definida como de elementos desconocidos (es lo que tiene la falta de experiencia en hacer lo que no se puede)
import java.io.*; public class WordReader extends FilterReader { private String[] st = null; private int buffCount=0; public WordReader(Reader r){ super((r instanceof BufferedReader) ? r : new BufferedReader(r)); } public String readWord() throws IOException { while (buffCount==0){ String s; while ((s=((BufferedReader)in).readLine())!=null && (s=s.replaceAll("[^\\p{Alpha}áéíóúÁÉÍÓÚñÑ]+"," ").trim()).equals("")); if (s==null) return null; st=s.split(" +?"); buffCount=st.length; } return st[st.length-(buffCount--)]; } }
import java.io.*; import java.util.*; public class NGramV1 { private static class MutableInteger{ int n=1; @Override public String toString(){return n+"";} } private static Map<String, MutableInteger> readWordsToMap(Reader r) throws IOException{ Map<String, MutableInteger> mapa = new TreeMap<String, MutableInteger>(); WordReader wr = new WordReader(r); String w; while ((w = wr.readWord()) != null) { w = w.toLowerCase(); MutableInteger cuenta; if ((cuenta=mapa.get(w))!=null) cuenta.n++; else mapa.put(w,new MutableInteger()); } return mapa; } private static int addCounts(Map<String, MutableInteger> m){ int n=0; for (String s:m.keySet()) n+=m.get(s).n; return n; } public static void main(String[] args) throws IOException { Map<String, MutableInteger> mapa = readWordsToMap(new FileReader(args[0])); System.out.printf("Tamaño del vocabulario: %d%nTamaño del texto (words): %d%n",mapa.size(),addCounts(mapa)); for (String s:mapa.keySet()) System.out.println(mapa.get(s) + "\t" + s); } }
Hemos revisado el código "mejorado" del que vimos ayer en clase y que es el que puse ahí arriba
También hemos visto una nueva versión capaz de mostrar los resultados ordenados alfabéticamente (ya lo hacia lo anterior) y por cuentas
import java.util.*; public class WordCount implements Comparable<WordCount> { //Zona "dinamica", para generar objetos (palabra-cuenta) String word; Integer count; public WordCount(String word, Integer count) { this.word = word; this.count = count; } private static boolean sortByCount=false; @Override public int compareTo(WordCount o) { if (sortByCount) return o.count-count; return this.word.compareTo(o.word); } //Zona estática para gestionar un array //Ojo, no está bien rematado esto, es algo para resolver el ejercicio pero //no es una pieza de código como "para regalar" private static int indice; static WordCount[] elArray; public static void dimensionaArray(int n){ elArray=new WordCount[n]; } public static void add(String word, Integer count){ if (indice>=elArray.length) throw new ArrayIndexOutOfBoundsException(); elArray[indice++]=new WordCount(word,count); } public static void sortByCount(){ sortByCount=true; Arrays.sort(elArray); } public static void sortByWord(){ sortByCount=false; Arrays.sort(elArray); } public static int totalCount(){ int n=0; for (WordCount wc:elArray){ n+=wc.count; } return n; } }
import java.io.*; import java.util.*; public class NGramV2 { //Clase Integer mutable para poder llevar las cuentas en un objeto private static class MutableInteger{ int n=1; public Integer getInteger(){return new Integer(n);} } // private static void readToWordCountArray(Reader r) throws IOException{ Map<String, MutableInteger> mapa = new TreeMap<String, MutableInteger>(); WordReader wr = new WordReader(r); String w; while ((w = wr.readWord()) != null) { w = w.toLowerCase(); MutableInteger cuenta; if ((cuenta=mapa.get(w))!=null) cuenta.n++; else mapa.put(w,new MutableInteger()); } WordCount.dimensionaArray(mapa.size()); for (String s:mapa.keySet()) WordCount.add(s, mapa.get(s).getInteger()); } private static int addCounts(Map<String, MutableInteger> m){ int total=0; for (String s:m.keySet()) total+=m.get(s).n; return total; } public static void main(String[] args) throws IOException { System.out.println("VERSION 2"); readToWordCountArray(new FileReader(args[0])); //Comentado abajo cómo controlar conversión de caracteres si hay problemas. //readToWordCountArray(new InputStreamReader(new FileInputStream(args[0]), "latin1")); System.out.printf("Tamaño del vocabulario: %d%nTamaño del texto (words): %d%n",WordCount.elArray.length,WordCount.totalCount()); WordCount.sortByCount(); for (WordCount wc: WordCount.elArray) System.out.println(wc.count + "\t" + wc.word); } }
Hemos dado alguna vuelta al asunto de la práctica final: ajedrez en red; hablando de casos de uso y cómo ha de ser en líneas muy generales
A continuación hemos visto algo de procesamiento de XML puesto que puede formar parte del desarrollo del proyecto.
Exception
) float[]
para el array de valores, cuando debe ser int[]
Histograma
que es la clase que encierra la dificultad del ejercicio. Se ha pedido a javadoc que genere documentación incluso para elementos con acceso privado y de "package").
Primera aproximación a las capacidades del sistema mediante sus interfaces de usuario.
Tras la clase, el "stub" que descargais aquí arriba está actualizado (si he pasado algo por alto o si convenimos algo nuevo, volverá a cambiar). Ahora sólo arranca la ventana principal, y se pueden arrancar ventanas de tablero pulsando en los usuarios. Se ha añadido itambién algún detalle más a modo de ejemplo, como los dialogos en los botones, o el color de fondo tras el tablero que -como sugerencia- puede servir para indicar si toca mover (verde) o se está a la espera del contrario (rojo) (pulsando en el tablero se ve cambiar)
Para lo de los dialogos, está interesante esta página
Al finalizar la clase decidimos el repato de tareas para el proyecto:
BufferStrategy
and BufferCapabilities
Your use of this page http://download.oracle.com/javase/tutorial and all the material on pages under "The Java Tutorials" banner is subject to the Terms of Use. Additionally, any example code contained in any of these Java Tutorials pages is also licensed under the Code Sample License.
|
Copyright © 1995, 2011 Oracle and/or its affiliates. All rights reserved. |