私はJavaを学んでいるだけで、ハフマンツリーを作成するプログラムを作成しようとしています。私のBubblesortスクリプトが奇妙な結果を出す
私は、コードの一部が最適化されていないことを知っています(私はそれが終了したら、後でそれを最適化しようとします)、プログラムは終了しませんが、私を悩ます問題は、Bubblesort私が書いたスクリプトは機能せず、間違いを見つけられません。
出力に順序配列を与える必要があります。
私が今までに書いたコードはすべて、あなたがそれを見たいと思った場合に備えて掲載しました。
import java.util.ArrayList;
abstract class HuffmanTree {
public final int frequency;
public HuffmanTree(int freq) {
frequency = freq;
}
}
class LeafWrapper {
ArrayList<HuffmanLeaf> leafArray = new ArrayList<HuffmanLeaf>();
public LeafWrapper() {
}
public void setLeafArray(HuffmanLeaf l) {
leafArray.add(l);
}
public void visLeafs() {
int i=0;
for (HuffmanLeaf l : leafArray) {
System.out.println("LeafArray[" + i + "]: " + l);
i++;
}
}
public void bubbleSort() {
HuffmanLeaf temp;
HuffmanLeaf[] leaf = new HuffmanLeaf[leafArray.size()];
leafArray.toArray(leaf);
for (int i = 0; i < (leaf.length-1) ; i++) {
for (int j = 0; j < leaf.length; j++) {
if(leaf[j].frequency<leaf[j+1].frequency){
temp=leaf[j];
leaf[j]=leaf[j+1];
leaf[j+j]=temp;
}
}
}
// leafArray.clear();
for (int i = 0; i < leaf.length; i++) {
System.out.println(leaf[i]);
}
}
public void frequencyAnalysis(char v[]) {
boolean counted;
char[] Contato = new char[v.length];
int[] NumChar = new int[v.length];
int n;
char c;
for(int i=0; i<v.length; i++) {
counted=false;
for(int j=0; j<v.length; j++)
if(v[i] == Contato[j])
counted=true;
n = 0;
if(counted == false) {
c = v[i];
for(int k=0; k<v.length; k++) {
if(v[k] == c)
n++;
}
Contato[i] = v[i];
if(Contato[i] != 0) {
NumChar[i] = n;
System.out.println(Contato[i] + ": " + n);
}
}
}
for (int i=0; i<v.length; i++) {
if(Contato[i] != 0)
leafArray.add(new HuffmanLeaf(NumChar[i], Contato[i]));
}
}
}
class HuffmanLeaf extends HuffmanTree {
public final char data;
public HuffmanLeaf(int freq, char val) {
super(freq);
data = val;
}
public String toString() {
return "Leaf: [" + data + ", " + frequency + "]";
}
}
class HuffmanNode extends HuffmanTree {
public final HuffmanTree left, right;
public HuffmanNode(HuffmanTree l, HuffmanTree r) {
super(l.frequency + r.frequency);
left = l;
right = r;
}
}
class TestHuffman{
public static void main(String[] args) {
LeafWrapper HT1 = new LeafWrapper();
String v = "ciao_mamma";
HT1.frequencyAnalysis(v.toCharArray());
System.out.println(" ");
HT1.visLeafs();
System.out.println(" ");
HT1.bubbleSort();
}
}
OUTPUTあなたのコード内の2つのバグがあります
LeafArray[0]: Leaf: [c, 1]
LeafArray[1]: Leaf: [i, 1]
LeafArray[2]: Leaf: [a, 3]
LeafArray[3]: Leaf: [o, 1]
LeafArray[4]: Leaf: [_, 1]
LeafArray[5]: Leaf: [m, 3]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
これを読んでください:https://en.wikipedia.org/wiki/Bubble_sort#Pseudocode_implementation – prsvr
この質問にはあまりにも多くのコードがあり、私たちがあなたの問題を見つけるのを困難にしています。あなたの好きなデバッガで時間をかけて、問題を引き起こしていないコードを削除してください。 –
'j == leaf.length - 1'のときは' j + 1 == leaf.length'となり、if節のインデックス付けは 'IndexOutOfBoundsException'で失敗します。 –