⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashpersongroup.java

📁 本软件是使用java 开发的
💻 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 + -