<commit_before>/**
 * @author <NAME>
 * @deprecated Algorithm of Huffman
 * @version 0.0.3
 */

//http://www.eztigma.tk/juegos/binary.php

import java.util.Scanner;
import java.util.TreeMap;
import java.util.PriorityQueue;

public class Huffman {

    static Nodo treeD;
    static Nodo tree;
    private static String keys = "";
    private static String k = "";
    private static Text t = new Text();
    private static String keyC = "";
    private static String Separator = "~";

    public static void enOrden(Nodo arbol){
        if (arbol != null){
        	System.out.println("Nodo izq");
            enOrden(arbol.getHijoIzq());
            System.out.println("key " + arbol.getkey() + " valor " + arbol.getValue());
            System.out.println("Nodo Der");
            enOrden(arbol.getHijoDer());
        }
                System.out.println("---Fin---");
    }	

    public static void posOrden(Nodo arbol){
        if (arbol != null){
        	System.out.println("Nodo izq P");
            enOrden(arbol.getHijoIzq());
            System.out.println("Nodo der P");
            enOrden(arbol.getHijoDer());
            System.out.println("Valor en el nodo: "+arbol.getValue());
        }
    }
    
    /**
	 *  Este método se encarga de retirar cada par de elementos de menor
	 *  frecuencia en la cola, y sumar su peso con el fin de crear 
	 *  pequeños subArboles, que seran nuevamente agregados a la cola
	 *  hasta obtener un unico arbol.
	 *
	 *  @param cola   Cola de prioridades ordenada por frecuencia de 
	 *				  cada caracter en el mapa.	 
	 *  @param arbol  Es una instancia de la clase Arbol.
	 */
	private static void createTree(PriorityQueue cola, Arbol arbol, 
                huffmanGui UI) {

            Nodo father = null; 
            Nodo oneAux;

            if(cola.size() == 1) {
                oneAux = (Nodo) cola.poll();
                Integer oneOnly = oneAux.getValue();
                father = Arbol.insertarNodo(oneOnly, oneAux, father);
                cola.add(father);
            }
            while(cola.size() > 1) {  
                Nodo one = (Nodo) cola.poll();
                Nodo two = (Nodo) cola.poll();               
                Integer onePlusTwo = one.getValue() + two.getValue(); 
                father = Arbol.insertarNodo(onePlusTwo,one,two,father);
                cola.add(father);    	
            }
            tree = (Nodo)cola.peek();
            getKeys((Nodo)cola.poll());
	}

	/**
	 *  Este método realiza un recorrido en orden de un arbol  
	 *
	 *  @param arbol  Es una instancia de la clase Nodo.
	 *	@param key    Es el binario 0 ó 1 asociado a cada arco del arbol
	 */
        public static void order(Nodo arbol, String key){
            keys += key;
            if (arbol != null){
                order(arbol.getHijoIzq(), "0");
                if(!(arbol.getkey().equals("")))
                    k += (arbol.getkey() + " : " + keys + Separator);
                order(arbol.getHijoDer(), "1");
            }
            keys = keys.substring(0,keys.length()-1);
        }	

	/**
	 *  Este método realiza un recorrido a medias, en Pos Orden de un arbol,
	 *  con el fin de asociar un valor binario a cada arco de este.
	 *
	 *  @param arbol  Es una instancia de la clase Nodo.
	 */
    public static void getKeys(Nodo arbol) {
    	if(arbol != null) {
    		order(arbol.getHijoIzq(), "0");
            order(arbol.getHijoDer(), "1");   		
    	}

    }	

	/**
	 *  Este método imprime las claves asociadas a cada hoja del arbol.
	 */
	public static void printKeys(huffmanGui UI) {	
		String Keys;
                if(k.contains("\n")) {
                    Keys = k.replace("\n","º");
                    Keys = Keys.replace(Separator, "\n");
                    //keys = (k.indexOf("\n")-1);
                }else {
                    Keys = k.replace(Separator, "\n"); 
                }
                
                UI.txaKeys.setText("-Keys- \n" + Keys);
		System.out.println("-Keys- \n" + Keys);
                t.write("claves.txt", Keys);
	}

	/**
	 *  Esta función realiza un reemplazo de cada caracter del texto
	 *  por su respectiva key asignada al arbol; luego imprime el nuevo
	 *  texto resultante del anterior proceso. 
	 *
	 *	@param T  Texto
	 */
	public static String prinTextCompress(String T) {
		char[] Keys;
                Keys = T.toCharArray();
		char comp;
		String keyComplete = "";
                String _k = k.replaceAll(" : ","");
		for(int i = 0; i <= Keys.length-1; i++) {
			comp = Keys[i]; 
			if(Keys[i] == comp) {
                            int x = _k.indexOf(comp)+1;
                            keyComplete += _k.substring(_k.indexOf(comp)+1,
                                    _k.indexOf(Separator,_k.indexOf(comp)));
			}
		}
                t.write("comprimido.txt", keyComplete);
                return keyComplete;
	}		

	/**
     *  Este método crea el arbol de codificación huffman por medio de
     *  métodos de apoyo, reemplazando cada caracter del texto a un binario,
     *  después retorna el nuevo texto resultante del anterior proceso.
	 *
	 *	@param TC  Texto Comprimido
     *  @param key Claves Del Texto<commit_msg>the method  overloaded 'printTextDescompress' is added.<commit_after>/**
 * @author <NAME>
 * @deprecated Algorithm of Huffman
 * @version 0.0.3
 */

//http://www.eztigma.tk/juegos/binary.php

import java.util.Scanner;
import java.util.TreeMap;
import java.util.PriorityQueue;

public class Huffman {

    static Nodo treeD;
    static Nodo tree;
    private static String keys = "";
    private static String k = "";
    private static Text t = new Text();
    private static String keyC = "";
    private static String Separator = "~";

    public static void enOrden(Nodo arbol){
        if (arbol != null){
        	System.out.println("Nodo izq");
            enOrden(arbol.getHijoIzq());
            System.out.println("key " + arbol.getkey() + " valor " + arbol.getValue());
            System.out.println("Nodo Der");
            enOrden(arbol.getHijoDer());
        }
                System.out.println("---Fin---");
    }	

    public static void posOrden(Nodo arbol){
        if (arbol != null){
        	System.out.println("Nodo izq P");
            enOrden(arbol.getHijoIzq());
            System.out.println("Nodo der P");
            enOrden(arbol.getHijoDer());
            System.out.println("Valor en el nodo: "+arbol.getValue());
        }
    }
    
    /**
	 *  Este método se encarga de retirar cada par de elementos de menor
	 *  frecuencia en la cola, y sumar su peso con el fin de crear 
	 *  pequeños subArboles, que seran nuevamente agregados a la cola
	 *  hasta obtener un unico arbol.
	 *
	 *  @param cola   Cola de prioridades ordenada por frecuencia de 
	 *				  cada caracter en el mapa.	 
	 *  @param arbol  Es una instancia de la clase Arbol.
	 */
	private static void createTree(PriorityQueue cola, Arbol arbol, 
                huffmanGui UI) {

            Nodo father = null; 
            Nodo oneAux;

            if(cola.size() == 1) {
                oneAux = (Nodo) cola.poll();
                Integer oneOnly = oneAux.getValue();
                father = Arbol.insertarNodo(oneOnly, oneAux, father);
                cola.add(father);
            }
            while(cola.size() > 1) {  
                Nodo one = (Nodo) cola.poll();
                Nodo two = (Nodo) cola.poll();               
                Integer onePlusTwo = one.getValue() + two.getValue(); 
                father = Arbol.insertarNodo(onePlusTwo,one,two,father);
                cola.add(father);    	
            }
            tree = (Nodo)cola.peek();
            getKeys((Nodo)cola.poll());
	}

	/**
	 *  Este método realiza un recorrido en orden de un arbol  
	 *
	 *  @param arbol  Es una instancia de la clase Nodo.
	 *	@param key    Es el binario 0 ó 1 asociado a cada arco del arbol
	 */
        public static void order(Nodo arbol, String key){
            keys += key;
            if (arbol != null){
                order(arbol.getHijoIzq(), "0");
                if(!(arbol.getkey().equals("")))
                    k += (arbol.getkey() + " : " + keys + Separator);
                order(arbol.getHijoDer(), "1");
            }
            keys = keys.substring(0,keys.length()-1);
        }	

	/**
	 *  Este método realiza un recorrido a medias, en Pos Orden de un arbol,
	 *  con el fin de asociar un valor binario a cada arco de este.
	 *
	 *  @param arbol  Es una instancia de la clase Nodo.
	 */
    public static void getKeys(Nodo arbol) {
    	if(arbol != null) {
    		order(arbol.getHijoIzq(), "0");
            order(arbol.getHijoDer(), "1");   		
    	}

    }	

	/**
	 *  Este método imprime las claves asociadas a cada hoja del arbol.
	 */
	public static void printKeys(huffmanGui UI) {	
		String Keys;
                if(k.contains("\n")) {
                    Keys = k.replace("\n","º");
                    Keys = Keys.replace(Separator, "\n");
                    //keys = (k.indexOf("\n")-1);
                }else {
                    Keys = k.replace(Separator, "\n"); 
                }
                
                UI.txaKeys.setText("-Keys- \n" + Keys);
		System.out.println("-Keys- \n" + Keys);
                t.write("claves.txt", Keys);
	}

	/**
	 *  Esta función realiza un reemplazo de cada caracter del texto
	 *  por su respectiva key asignada al arbol; luego imprime el nuevo
	 *  texto resultante del anterior proceso. 
	 *
	 *	@param T  Texto
	 */
	public static String prinTextCompress(String T) {
		char[] Keys;
                Keys = T.toCharArray();
		char comp;
		String keyComplete = "";
                String _k = k.replaceAll(" : ","");
		for(int i = 0; i <= Keys.length-1; i++) {
			comp = Keys[i]; 
			if(Keys[i] == comp) {
                            int x = _k.indexOf(comp)+1;
                            keyComplete += _k.substring(_k.indexOf(comp)+1,
                                    _k.indexOf(Separator,_k.indexOf(comp)));
			}
		}
                t.write("comprimido.txt", keyComplete);
                return keyComplete;
	}

    /**
     *  Esta Función convierte cada caracter del texto a un binario, luego
     *  imprime el nuevo texto resultante del anterior proceso.
     *
     *  @param T  Texto
     */
    public static String printTextDescompress(String T) {
        char[] Keys;
                Keys = T.toCharArray();

        String keyBinary[] = new String[T.length()];
        String keyBin = "";
        for (int i = 0; i <= Keys.length-1; ++i) {
            keyBinary[i] = String.format("%s", 
                                Integer.toBinaryString(Keys[i]));
            keyBin += keyBinary[i] + " ";
        }
                return keyBin;
    }    		

	/**
     *  Este método crea el arbol de codificación huffman por medio de
     *  métodos de apoyo, reemplazando cada caracter del texto a un binario,
     *  después retorna el nuevo texto resultante del anterior proceso.
	 *
	 *	@param TC  Texto Comprimido
     *  @param key Claves Del Texto
{'fraction_non_alphanumeric': 0.12065217391304348, 'fraction_numerical': 0.0034420289855072463, 'mean_word_length': 1.7485685835200397, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3496699', 'n_tokens_mistral': 3655, 'n_tokens_neox': 3482, 'n_words': 937}