2025-12-18 12:34:39 +01:00
|
|
|
package fr.iutfbleau.sae.mhuffman;
|
2025-12-15 20:14:12 +01:00
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
public class CanonicalCode{
|
2025-12-27 12:42:38 +01:00
|
|
|
private Map<Integer, String> codeLengths = new HashMap<>();
|
2025-12-27 10:20:24 +01:00
|
|
|
private Map<Integer, String> canonicalCodes = new HashMap<>();
|
2025-12-15 20:14:12 +01:00
|
|
|
|
|
|
|
|
|
2025-12-27 10:20:24 +01:00
|
|
|
public Map<Integer,String> generateCodes(){
|
2025-12-20 14:01:36 +01:00
|
|
|
// 1 ere chose à faire : on regarde uniquement la longueur des codes initiaux(Huffman)
|
|
|
|
|
// 2eme chose à faire : remettre dans l'ordre des longueurs : si meme taille ==> regarder valeur
|
2025-12-27 12:42:38 +01:00
|
|
|
// 3eme chose à faire : ecriture des codes canoniques
|
2025-12-18 13:34:57 +01:00
|
|
|
|
2025-12-20 14:01:36 +01:00
|
|
|
// on recupere les entrées des codes Huffman pour pouvoir les triés
|
2025-12-27 12:42:38 +01:00
|
|
|
List<Map.Entry<Integer, String>> liste = new ArrayList<>(codeLengths.entrySet());
|
2025-12-18 13:34:57 +01:00
|
|
|
|
2025-12-20 14:01:36 +01:00
|
|
|
// ici on comparer par longueur de la valeur ou sinon par la clé
|
2025-12-27 12:42:38 +01:00
|
|
|
|
|
|
|
|
Collections.sort(liste, new Comparator<Map.Entry<Integer, String>>() {
|
|
|
|
|
@Override
|
|
|
|
|
public int compare(Map.Entry<Integer, String> arg1 ,Map.Entry<Integer, String> arg2) {
|
2025-12-18 13:34:57 +01:00
|
|
|
|
2025-12-27 12:42:38 +01:00
|
|
|
int length1 = arg1.getValue().length();
|
|
|
|
|
int length2 = arg2.getValue().length();
|
|
|
|
|
|
|
|
|
|
if (length1 != length2) {
|
|
|
|
|
return length1 - length2;
|
|
|
|
|
}
|
|
|
|
|
return arg1.getKey() - arg2.getKey();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int code = 0; // code canonique à attribuer
|
2025-12-20 14:01:36 +01:00
|
|
|
int temp = 0; //garde la longueur du code précedent , pour gérer le décalage
|
2025-12-18 13:34:57 +01:00
|
|
|
|
2025-12-27 12:42:38 +01:00
|
|
|
for (Map.Entry<Integer, String> entree : liste ) {
|
2025-12-20 14:01:36 +01:00
|
|
|
int valeur = entree.getKey(); // symbole actuel
|
2025-12-27 12:42:38 +01:00
|
|
|
int longueur = entree.getValue().length(); // longueur du code actuel
|
2025-12-20 14:01:36 +01:00
|
|
|
|
2025-12-27 12:42:38 +01:00
|
|
|
code <<= (longueur - temp); // permet de décaler le code actuel si la longueur augmente
|
|
|
|
|
String codeBinaire = Integer.toBinaryString(code);
|
|
|
|
|
|
|
|
|
|
// permet d'ajouter des zeros si nécessaire !!!
|
|
|
|
|
while (codeBinaire.length() < longueur) {
|
|
|
|
|
codeBinaire = "0" + codeBinaire;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
canonicalCodes.put(valeur,codeBinaire); // ajout dans le dictionnaire
|
2025-12-20 14:01:36 +01:00
|
|
|
code++; // incrémentation pour la valeur qui suit
|
|
|
|
|
temp = longueur; // mise à jour de la longueur précedente
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return canonicalCodes;
|
2025-12-18 13:34:57 +01:00
|
|
|
}
|
|
|
|
|
|
2025-12-15 20:14:12 +01:00
|
|
|
|
2025-12-27 12:42:38 +01:00
|
|
|
public String getCode(int value){
|
|
|
|
|
return this.canonicalCodes.get(value);
|
2025-12-15 20:14:12 +01:00
|
|
|
}
|
|
|
|
|
|
2025-12-27 10:20:24 +01:00
|
|
|
public int getLength(int value){
|
2025-12-27 12:42:38 +01:00
|
|
|
return this.codeLengths.get(value).length();
|
2025-12-15 20:14:12 +01:00
|
|
|
}
|
2025-12-18 13:34:57 +01:00
|
|
|
|
|
|
|
|
|
2025-12-27 10:20:24 +01:00
|
|
|
public Map<Integer,String> getCanonicalCodes(){
|
2025-12-18 13:34:57 +01:00
|
|
|
return this.canonicalCodes;
|
|
|
|
|
}
|
2025-12-18 12:34:39 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|