From d1be7e437d4b162872f3357bf3d7fd2487ad3a36 Mon Sep 17 00:00:00 2001 From: L <@> Date: Mon, 5 May 2025 21:41:40 +0200 Subject: [PATCH] fertig --- Aufgaben.java | 57 ++++++++++++++++ Main.java => Komprimierung.java | 60 ++++++++--------- Node.java | 7 +- compressed.txt | 2 +- package.bluej | 112 +++++++++++++++++++++++--------- 5 files changed, 170 insertions(+), 68 deletions(-) create mode 100644 Aufgaben.java rename Main.java => Komprimierung.java (86%) diff --git a/Aufgaben.java b/Aufgaben.java new file mode 100644 index 0000000..1b607dc --- /dev/null +++ b/Aufgaben.java @@ -0,0 +1,57 @@ +import java.util.HashMap; +import java.util.Map; +public class Aufgaben +{ + public static void buchstabenZählen(String text) + { + var häufigkeiten = Zählen.countEachLetter(text); + + Zählen.printZahl(häufigkeiten); + } + + public static void binärbaum(String text) + { + Map zahlen = Zählen.countEachLetter(text); + Node wurzel = Node.erstellen(zahlen); + + HashMap codes = new HashMap(); + + if(wurzel.getLeft() == null && wurzel.getRight() == null) + { + codes.put(wurzel.getBuchstabe(), "0"); + } + else + { + Komprimierung.generieren(codes,wurzel,""); + } + + for (var entry : codes.entrySet()) + { + System.out.println("Buchstabe: " + entry.getKey() + ", Code: " + entry.getValue()); + } + } + + public static void huffmanCodierun (String text) + { + Map zahlen = Zählen.countEachLetter(text); + Node wurzel = Node.erstellen(zahlen); + + System.out.println("Huffman-Codierung: " + Komprimierung.codierung(text,wurzel)); + } + + public static void decodierung (String text) + { + System.out.println("Kodierter Text: " + Komprimierung.codierungInklBaum(text)); //soviele Zeichen aufgrund von UTF-16 + System.out.println("Decodierter Text: " + Komprimierung.decodierungInlkBaum(Komprimierung.codierungInklBaum(text))); + } + + public static void dateinKomprimierung (String source, String target) + { + Komprimierung.compressFile(source,target); + } + + public static void dateinLesen (String file) + { + Komprimierung.readFile(file); + } +} diff --git a/Main.java b/Komprimierung.java similarity index 86% rename from Main.java rename to Komprimierung.java index 32a06d6..500f5df 100644 --- a/Main.java +++ b/Komprimierung.java @@ -5,7 +5,7 @@ import java.util.Stack; import java.nio.file.Files; import java.nio.file.Path; -public class Main +public class Komprimierung { public static byte[] nullCharBytes = {(byte)0xFF,(byte)0xFF}; public static void test(String text) @@ -157,38 +157,37 @@ public class Main //decodiert Buchstaben und speichert den Baum public static String decodierungInlkBaum(String code) { - String codierterTextErstIndex = code.substring(0,32); - int textErstIndex = binärString_to_int(codierterTextErstIndex); + String codierterTextErstIndex = code.substring(0,32); //holt binärcode vom TextErstIndex + int textErstIndex = binärString_to_int(codierterTextErstIndex); //wandelt codierterTextErstIndex in eine Integer String codierterBaum = code.substring(32, textErstIndex); Node decodierterBaum = binärString_to_baum(codierterBaum); String codierterText = code.substring(textErstIndex, code.length()); - String decodierterText = decodierungBaum(codierterText,decodierterBaum); + String decodierterText = decodierungBaum(codierterText,decodierterBaum); //decodiert den Text mit dem Baum return decodierterText; } + //decodiert den Baum public static String decodierungBaum(String code,Node baum) { Node current = baum; String decoded = ""; boolean hatNurEinBuchstabenart = current.getRight() == null && current.getLeft() == null; - if(hatNurEinBuchstabenart) + if(hatNurEinBuchstabenart) //nimmt den einen Buchstabe und fügt ihn für n mal ein { for(int i=0;i8"); return null; } byte result = 0; - for(byte i=0 ;i<8;i++) + for(byte i=0 ;i<8;i++) //geht den binärString durch und wandelt ihn in byte um { if(binärString.charAt(7-i) == '1')result|=1<>(7-i))&1)==1; + boolean bit= ((b>>(7-i))&1)==1; //schaut ob der 7-i ste bit 1 ist result+= bit?'1': '0'; //falls bit wert 1 hat addiert es 1 zu dem string, wenn nicht dann addiertes es 0 } @@ -248,7 +246,7 @@ public class Main byte[] b = nullCharBytes; - if(c != null) + if(c != null) //wandelt character in "byte" { var byteBuffer = ByteBuffer.allocate(2); byteBuffer.putChar(c); @@ -256,7 +254,7 @@ public class Main } String result = ""; - for(int i=0;i äste = new Stack(); + Stack äste = new Stack(); //erstellt ein leeres Stack for(int i=0;i32"); return null; } int result = 0; - for(int i=0 ;i<32;i++) + for(int i=0 ;i<32;i++) //geht den binärString durch und wandelt ihn int um { if(binärString.charAt(31-i) == '1')result|=1< häufigkeiten) { - PriorityQueue nodes = new PriorityQueue(Comparator.comparingInt(n -> n.anzahl)); + //erstellt PriorityQueue die nach Anzahl sortiert + PriorityQueue nodes = new PriorityQueue(Comparator.comparingInt(n -> n.anzahl)); - for (var entry : häufigkeiten.entrySet()) + for (var entry : häufigkeiten.entrySet()) //erstellt die Nodes und brfüllt die queue damit { Node node = new Node(); node.setAnzahl(entry.getValue()); @@ -52,7 +53,7 @@ public class Node - while (nodes.size() > 1) + while (nodes.size() > 1) //erstellt den Baum { Node min1 = nodes.poll(); Node min2 = nodes.poll(); diff --git a/compressed.txt b/compressed.txt index 2a9ebd4..9abb6b7 100644 --- a/compressed.txt +++ b/compressed.txt @@ -1 +1 @@ -000000000000000000000000101100001111111111111111000000000110000111111111111111110000000001100010111111111111111100000000000010101111111111111111000000000110001100000000000011010000101011101111110 \ No newline at end of file +00000000000000000000000010010000111111111111111100000000011000011111111111111111000000000110001011111111111111110000000001100011000000000000101000001010110111 \ No newline at end of file diff --git a/package.bluej b/package.bluej index 021d206..906bea8 100644 --- a/package.bluej +++ b/package.bluej @@ -1,32 +1,80 @@ -#BlueJ package file -editor.fx.0.height=0 -editor.fx.0.width=0 -editor.fx.0.x=0 -editor.fx.0.y=0 -objectbench.height=100 -objectbench.width=776 -package.divider.horizontal=0.6 -package.divider.vertical=0.8003731343283582 -package.editor.height=422 -package.editor.width=661 -package.editor.x=125 -package.editor.y=189 -package.frame.height=600 -package.frame.width=800 -package.numDependencies=0 -package.numTargets=1 -package.showExtends=true -package.showUses=true -project.charset=UTF-8 -readme.height=60 -readme.name=@README -readme.width=48 -readme.x=10 -readme.y=10 -target1.height=70 -target1.name=Main -target1.showInterface=false -target1.type=ClassTarget -target1.width=120 -target1.x=70 -target1.y=10 +#BlueJ package file +dependency1.from=Komprimierung +dependency1.to=Node +dependency1.type=UsesDependency +dependency2.from=Komprimierung +dependency2.to=Z\u00E4hlen +dependency2.type=UsesDependency +dependency3.from=Aufgaben +dependency3.to=Node +dependency3.type=UsesDependency +dependency4.from=Aufgaben +dependency4.to=Z\u00E4hlen +dependency4.type=UsesDependency +dependency5.from=Aufgaben +dependency5.to=Komprimierung +dependency5.type=UsesDependency +editor.fx.0.height=1447 +editor.fx.0.width=1294 +editor.fx.0.x=1273 +editor.fx.0.y=0 +objectbench.height=198 +objectbench.width=1254 +package.divider.horizontal=0.6 +package.divider.vertical=0.6730462519936204 +package.editor.height=415 +package.editor.width=1143 +package.editor.x=0 +package.editor.y=0 +package.frame.height=727 +package.frame.width=1294 +package.numDependencies=5 +package.numTargets=6 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +readme.height=60 +readme.name=@README +readme.width=49 +readme.x=10 +readme.y=10 +target1.height=70 +target1.name=Aufgaben +target1.showInterface=false +target1.type=ClassTarget +target1.width=120 +target1.x=150 +target1.y=30 +target2.height=70 +target2.name=Z\u00E4hlen +target2.showInterface=false +target2.type=ClassTarget +target2.width=120 +target2.x=50 +target2.y=300 +target3.height=70 +target3.name=Node +target3.showInterface=false +target3.type=ClassTarget +target3.width=120 +target3.x=50 +target3.y=210 +target4.height=70 +target4.name=Text.txt +target4.type=TextTarget +target4.width=120 +target4.x=430 +target4.y=30 +target5.height=70 +target5.name=compressed.txt +target5.type=TextTarget +target5.width=120 +target5.x=290 +target5.y=30 +target6.height=70 +target6.name=Komprimierung +target6.showInterface=false +target6.type=ClassTarget +target6.width=120 +target6.x=250 +target6.y=160