sae fini les gars

This commit is contained in:
AlgaLaptop
2026-01-07 19:27:03 +01:00
parent c8556d469a
commit bf03d0cf8d
137 changed files with 13871 additions and 1525 deletions
@@ -1,55 +1,70 @@
package fr.iutfbleau.sae.mhuffman;
import java.util.*;
public class CanonicalCode{
//private Map<Integer, String> codeLengths = new HashMap<>();
//private Map<Integer, String> canonicalCodes = new HashMap<>();
/**
*
* Classe pour generer des codes canoniques de Huffman.
* Les codes canoniques sont des codes de Huffman reorganises
* pour faciliter la compression et le decodage.
*/
public class CanonicalCode {
/**
* Genere des codes canoniques a partir de codes de Huffman.
*
* @param codesHuffman les codes de Huffman initiaux
* @return les codes canoniques generes
*/
public Map<Integer, String> generateCodes(Map<Integer, String> codesHuffman) {
// On recupere les entrees des codes Huffman pour pouvoir les trier
List<Map.Entry<Integer, String>> liste = new ArrayList<>(codesHuffman.entrySet());
public Map<Integer,String> generateCodes(Map<Integer,String> codesHuffman){
// 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
// 3eme chose à faire : ecriture des codes canoniques
// on recupere les entrées des codes Huffman pour pouvoir les triés
List<Map.Entry<Integer, String>> liste = new ArrayList<>(codesHuffman.entrySet());
// ici on comparer par longueur de la valeur ou sinon par la clé
// On trie par longueur de la valeur ou sinon par la cle
Collections.sort(liste, new ComparateurCanonique());
Map<Integer,String> canonicalCodes = new HashMap<>();
int code = 0; // code canonique à attribuer
int temp = 0; //garde la longueur du code précedent , pour gérer le décalage
Map<Integer, String> canonicalCodes = new HashMap<>();
int code = 0; // Code canonique a attribuer
int temp = 0; // Garde la longueur du code precedent, pour gerer le decalage
for (Map.Entry<Integer, String> entree : liste ) {
int valeur = entree.getKey(); // symbole actuel
int longueur = entree.getValue().length(); // longueur du code actuel
for (Map.Entry<Integer, String> entree : liste) {
int valeur = entree.getKey(); // Symbole actuel
int longueur = entree.getValue().length(); // Longueur du code actuel
code <<= (longueur - temp); // permet de décaler le code actuel si la longueur augmente
code <<= (longueur - temp); // Permet de decaler 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;
}
// Permet d'ajouter des zeros si necessaire
while (codeBinaire.length() < longueur) {
codeBinaire = "0" + codeBinaire;
}
canonicalCodes.put(valeur,codeBinaire); // ajout dans le dictionnaire
code++; // incrémentation pour la valeur qui suit
temp = longueur; // mise à jour de la longueur précedente
canonicalCodes.put(valeur, codeBinaire); // Ajout dans le dictionnaire
code++; // Incrementation pour la valeur qui suit
temp = longueur; // Mise a jour de la longueur precedente
}
return canonicalCodes;
}
public String getCode(Map<Integer,String> canonicalCodes,int value){
return canonicalCodes.get(value);
}
public int getLength(Map<Integer,String> codesH,int value){
return codesH.get(value).length();
}
}
return canonicalCodes;
}
/**
* Recupere le code canonique d'une valeur.
*
* @param canonicalCodes la table des codes canoniques
* @param value la valeur dont on veut le code
* @return le code canonique correspondant
*/
public String getCode(Map<Integer, String> canonicalCodes, int value) {
return canonicalCodes.get(value);
}
/**
* Recupere la longueur d'un code pour une valeur donnee.
*
* @param codesH la table des codes
* @param value la valeur dont on veut la longueur
* @return la longueur du code en bits
*/
public int getLength(Map<Integer, String> codesH, int value) {
return codesH.get(value).length();
}
}