📄 hashpersongroup.java
字号:
package datastructure;
import javax.swing.*;
import java.awt.*;
import java.util.*;
class HashPersonGroup
extends Panel {
private CodeAnimationPanel codePanel;
//变量codePart用来控制源代码的同步显示,初始化为0
static int codePart;
//doneFlag记录演示是否完成,为真是表示已经完成
private boolean doneFlag;
int a[];
private int m;
private int p;
static int address;
private int tag;
private int c;
private float asl;
static int key;
private int q;
private int sum;
private int HashList[];
private int record1;
private int record2;
public HashPersonGroup(CodeAnimationPanel codePanel) {
this.codePanel = codePanel;
codePanel.highlight(12);
a = HashFrame.hsData.a;
m = HashFrame.hsData.m;
HashList = new int[m];
p = HashFrame.hsData.p;
key = HashFrame.hsData.key;
c = 0;
sum = 0;
tag = 0;
q = -1;
codePart = 0;
doneFlag = false;
this.codePanel.highlight(2);
for (int i = 0; i < HashList.length; i++)
HashList[i] = 0;
HashTabel.text2.setText(" " + String.valueOf(m));
HashTabel.text3.setText(" " + String.valueOf(p));
HashTabel.text4.setText(" " + String.valueOf(key));
record1 = record2 = -1;
}
public boolean getDoneFlag() {
return doneFlag;
}
public void draw(Graphics g) {
g.setColor(new Color(0, 0, 140));
g.fillRoundRect(10, 50, 50, 30, 5, 5);
g.setColor(Color.black);
g.drawRoundRect(10, 50, 50, 30, 5, 5);
g.setColor(Color.yellow);
g.drawString("数组a", 20, 68);
for (int i = 0; i < a.length; i++) {
if (i == tag && record1 != -1)
g.setColor(Color.red);
else
g.setColor(Color.blue);
g.fill3DRect(70 + i * 22 + i * 1, 50, 20, 30, true);
g.setColor(Color.black);
g.draw3DRect(70 + i * 22 + i * 1, 50, 20, 30, true);
g.drawString(String.valueOf(a[i]), 70 + i * 22 + i * 1 + 5, 50 + 22);
int r;
if (i > 10)
r = 55 + i * 22 + i * 1 + (i - 10) * 1;
else
r = 55 + i * 22 + i * 1;
g.drawString("a[" + String.valueOf(i) + "]", r + 12, 95);
}
g.setColor(Color.black);
g.drawString("哈希函数 H(key)= key % " + String.valueOf(p), 30, 160);
g.drawString("=", 335, 160);
g.draw3DRect(189, 144, 42, 27, true);
g.draw3DRect(239, 144, 32, 27, true);
g.draw3DRect(279, 144, 42, 27, true);
g.draw3DRect(359, 144, 42, 27, true);
g.setColor(Color.white);
g.fill3DRect(190, 145, 40, 25, true);
g.fill3DRect(240, 145, 30, 25, true);
g.fill3DRect(280, 145, 40, 25, true);
g.fill3DRect(360, 145, 40, 25, true);
g.setColor(Color.black);
g.drawString("%", 250, 160);
if (record2 != -1) {
g.drawString(String.valueOf(record1), 205, 160);
g.drawString(String.valueOf(record2), 295, 160);
int address1 = record1 % record2;
g.drawString(String.valueOf(address1), 372, 160);
}
for (int i = 0; i < m; i++) {
if ( (record1 % record2) == i && q == -1 && record2 != -1) {
g.setColor(Color.red);
if (codePart == 5 || codePart == 4)
g.drawString("冲突", 9 + i * 20, 310);
}
else if (q != -1) {
g.setColor(Color.red);
g.fill3DRect(10 + q * 20, 260, 20, 28, true);
g.setColor(Color.black);
g.draw3DRect(9 + q * 20, 259, 22, 30, true);
g.drawString(String.valueOf(q), 15 + q * 20, 250);
g.setColor(Color.white);
}
else
g.setColor(Color.white);
g.fill3DRect(10 + i * 20, 260, 20, 28, true);
g.setColor(Color.black);
g.draw3DRect(9 + i * 20, 259, 22, 30, true);
g.drawString(String.valueOf(i), 15 + i * 20, 250);
}
for (int i = 0; i < HashList.length; i++) {
if (HashList[i] != 0)
g.drawString(String.valueOf(HashList[i]), 15 + i * 20, 278);
}
if (q != -1) {
g.setColor(Color.black);
g.setColor(Color.white);
g.fill3DRect(10 + q * 20, 300, 20, 28, true);
g.setColor(Color.black);
g.draw3DRect(9 + q * 20, 299, 22, 30, true);
g.drawString(String.valueOf(key), 15 + q * 20, 318);
}
g.setColor(Color.red);
if (codePart <= 8)
g.drawString(" 构 建 哈 希 表 ", 30, 220);
else
g.drawString(" 查 找 元 素 key", 30, 220);
}
public void HashCoding() {
switch (codePart) {
case 0:
codePanel.highlight(3);
if (tag < a.length)
codePart = 1;
else
codePart = 9;
break;
case 1:
codePanel.highlight(4);
record1 = a[tag];
record2 = p;
address = a[tag] % p;
HashTabel.text5.setText(" " + String.valueOf(address));
codePart = 2;
break;
case 2:
codePanel.highlight(5);
if (HashList[address] == 0)
codePart = 3;
else
codePart = 4;
break;
case 3:
codePanel.highlight(6);
HashList[address] = a[tag];
codePart = 0;
tag++;
record2 = -1;
break;
case 4:
codePanel.highlight(7);
codePart = 5;
break;
case 5:
codePanel.highlight(8);
codePart = 6;
break;
case 6:
codePanel.highlight(9);
record1 = address + 1;
record2 = m;
address = (address + 1) % m;
HashTabel.text5.setText(" " + String.valueOf(address));
codePart = 7;
break;
case 7:
codePanel.highlight(10);
if (HashList[address] != 0)
codePart = 5;
else
codePart = 8;
break;
case 8:
codePanel.highlight(11);
HashList[address] = a[tag];
codePart = 0;
tag++;
record2 = -1;
break;
case 9:
codePanel.highlight(12);
record1 = key;
record2 = p;
address = key % p;
q = address;
c = 0;
HashTabel.text6.setText(" " + String.valueOf(address));
HashTabel.text7.setText(" " + String.valueOf(c));
codePart = 10;
break;
case 10:
codePanel.highlight(13);
if (HashList[address] != 0 && HashList[address] != key)
codePart = 11;
else
codePart = 12;
break;
case 11:
codePanel.highlight(14);
record1 = address + 1;
record2 = m;
address = (address + 1) % m;
q = address;
c++;
HashTabel.text6.setText(" " + String.valueOf(address));
HashTabel.text7.setText(" " + String.valueOf(c));
codePart = 10;
break;
case 12:
codePanel.highlight(15);
if (key == HashList[address])
codePart = 13;
else
codePart = 14;
break;
case 13:
codePanel.highlight(16);
doneFlag = true;
break;
case 14:
codePanel.highlight(17);
doneFlag = true;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -