`
MouseLearnJava
  • 浏览: 467274 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

可视化查找之顺序查找

阅读更多
如果查找过程和程序执行能结合起来,那么这个过程会更加直观。

本文简单地实现了顺序查找的可视化。界面很简单就包括两个部分:界面左侧是可视化查找部分,右侧是顺序查找的代码。如下图所示:

<<可视化查找之二分查找>>,请参考http://mouselearnjava.iteye.com/blog/1868263




程序的关键点主要有两点:
1. 如何在页面上表示出查找程序的运行过程。
2. 如何将排序程序的运行过程和可视化查找结合起来,保持状态一致。

我的解决方法如下:
我采用了JList去模拟程序的执行,JList有一个setSelectedIndex的方法,能高亮显示指定的行。通过改变selectedIndex的值,能够达到模拟程序执行的效果。根据模拟程序中保存的状态值去修改可视化查找。

程序主要是随机产生10个数值,查找数字9.



能够找到数字9

初始化界面




中间过程界面




结束界面



不能找到数字9的情况

初始化页面



中间过程



结束界面




具体代码如下:
package my.visualization.search.sequencial;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JRadioButtonMenuItem;

/**
 * 
 * @author Eric
 * @version 1.0
 *
 */
public class SequencialSearchVisualizationFrame extends JFrame {

	private static final long serialVersionUID = -6725108659717827278L;

	private Container contentPane;

	/**
	 * 设置三个Menu Item,分别用于开始程序,调整运行的速度以及退出程序
	 * 
	 */
	private JMenuItem startMI = new JMenuItem("Start");

	private JMenu speedMenu = new JMenu("Speed");

	private JMenuItem exitMI = new JMenuItem("Exit");
	
	private JMenuItem aboutMI = new JMenuItem("About");

	/**
	 * 设定5个速度级别
	 */
	private JRadioButtonMenuItem speedMI1 = new JRadioButtonMenuItem("Speed1",
			true);

	private JRadioButtonMenuItem speedMI2 = new JRadioButtonMenuItem("Speed2",
			false);

	private JRadioButtonMenuItem speedMI3 = new JRadioButtonMenuItem("Speed3",
			false);

	private JRadioButtonMenuItem speedMI4 = new JRadioButtonMenuItem("Speed4",
			false);

	private JRadioButtonMenuItem speedMI5 = new JRadioButtonMenuItem("Speed5",
			false);

	public int speedFlag = 1;
	
	private SequencialSearchPanel panel;

	public SequencialSearchVisualizationFrame(){
		
		setTitle("可视化查找之顺序查找");
		setSize(700, 400);
		setResizable(false);

		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		JMenu setMenu = new JMenu("Set");
		JMenu helpMenu = new JMenu("Help");
		
		setMenu.setMnemonic('s');
		setMenu.setMnemonic('H');

		menuBar.add(setMenu);
		menuBar.add(helpMenu);

		setMenu.add(startMI);
		setMenu.addSeparator();

		setMenu.addSeparator();
		setMenu.add(speedMenu);
		setMenu.addSeparator();
		setMenu.add(exitMI);

		ButtonGroup group = new ButtonGroup();
		group.add(speedMI1);
		group.add(speedMI2);
		group.add(speedMI3);
		group.add(speedMI4);
		group.add(speedMI5);

		speedMenu.add(speedMI1);
		speedMenu.add(speedMI2);
		speedMenu.add(speedMI3);
		speedMenu.add(speedMI4);
		speedMenu.add(speedMI5);

		startMI.addActionListener(new StartAction());
		speedMI1.addActionListener(new SpeedAction());
		speedMI2.addActionListener(new SpeedAction());
		speedMI3.addActionListener(new SpeedAction());
		speedMI4.addActionListener(new SpeedAction());
		speedMI5.addActionListener(new SpeedAction());
		exitMI.addActionListener(new ExitAction());
		helpMenu.add(aboutMI);
		aboutMI.addActionListener(new AboutAction());
		
		
		contentPane = getContentPane();
		
		panel = new SequencialSearchPanel(this);
		contentPane.add(panel);
		startMI.setEnabled(true);
	}
	
	private class StartAction implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			startMI.setEnabled(false);
			panel.timer.start();
		}
	}
	
	private class ExitAction implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			System.exit(0);
		}
	}
	
	private class SpeedAction implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			Object speed = event.getSource();
			if (speed == speedMI1) {
				speedFlag = 1;
			} else if (speed == speedMI2) {
				speedFlag = 2;
			} else if (speed == speedMI3) {
				speedFlag = 3;
			} else if (speed == speedMI4) {
				speedFlag = 4;
			} else if (speed == speedMI5) {
				speedFlag = 5;
			}

			panel.timer.setDelay(1000 - 200 * (speedFlag - 1));
		}
	}
	
	private class AboutAction implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			StringBuilder sb = new StringBuilder();
			sb.append("说明:\n1.本程序可视化顺序查找的过程\n").append("2.查找的数字为9\n").append(
					"3. 查找遍历时用PINK颜色表示\n").append("4.如果能找到,找到的数字用蓝色表示\n")
					.append("5. 如果没有找到,颜色全部为绿色");
			JOptionPane.showMessageDialog(
					SequencialSearchVisualizationFrame.this, sb.toString());
		}
	}
	
}


package my.visualization.search.sequencial;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Timer;

public class SequencialSearchPanel extends JPanel {

	private static final long serialVersionUID = -9149581857139587792L;

	private static final String[] code = {
			"public int sequencialSearch(int[] a, int key){", 
			"  for(int index=0;index<a.length;index++){",
			"     if(a[index] == key){", 
			"        return index;",
			"     }",
			"  }    ",
			"  return -1;         ", 
			"}" };

	/**
	 * 初始化10个数据
	 */
	private List<NumberRectangle> numbers = initialNumberRectangles();

	private JList codeList = new JList(code);;

	public TimerAction timerAction;

	public Timer timer;

	public SequencialSearchVisualizationFrame frame;

	public SequencialSearchPanel(SequencialSearchVisualizationFrame frame) {

		timerAction = new TimerAction();
		timer = new Timer(1000, timerAction);

		codeList.setSelectedIndex(1);
		JScrollPane scrollPane1 = new JScrollPane(codeList);
		this.setLayout(new BorderLayout());
		this.add(scrollPane1, BorderLayout.EAST);

		this.frame = frame;
	}
	
	private boolean completed = false;

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;

		drawNumberRectangles(g2);
	}

	private void drawNumberRectangles(Graphics2D g2) {
		for (NumberRectangle rectangle : numbers) {
			rectangle.draw(g2);
		}
	}

	int selectedIndex = 1;

	//查找9
	int key = 9;
	
	//当前的下标索引值
	int currentIndex = 0;

	private class TimerAction implements ActionListener, Serializable {

		private static final long serialVersionUID = -8671813189049345697L;

		public void actionPerformed(ActionEvent event) {
			if (completed) {
				return;
			}
			/**
			 * 为low 和 high着色
			 */
			switch (selectedIndex) {
			case 1:
				codeList.setSelectedIndex(selectedIndex);
				if(currentIndex>0){
					numbers.get(currentIndex-1).setColor(Color.GREEN);
				}
				if(currentIndex<10){
					selectedIndex = 2;
				}else{
					selectedIndex = 6;
				}
				break;
			case 2:
				codeList.setSelectedIndex(selectedIndex);
				numbers.get(currentIndex).setColor(Color.PINK);
				//查找9
				if(numbers.get(currentIndex).getValue() == key){
					selectedIndex = 3;
				}else{
					selectedIndex = 1;
					currentIndex++;
				}
				break;
			case 3:
				codeList.setSelectedIndex(selectedIndex);
				numbers.get(currentIndex).setColor(Color.BLUE);
			
				break;
				
			case 6 :
				codeList.setSelectedIndex(selectedIndex);
				break;
				
			default:
				break;
			}

			repaint();

		}
	}

	private List<NumberRectangle> initialNumberRectangles() {
		List<NumberRectangle> list = new ArrayList<NumberRectangle>();
		/**
		 * 随机产生10个数组
		 */
		Random random = new Random();
		for (int i = 1; i <= 10; i++) {
			list.add(new NumberRectangle(i,1,random.nextInt(15)+1, Color.GREEN));
		}
		return list;
	}

}


package my.visualization.search.sequencial;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

public class NumberRectangle {

	private int x;

	private int y;

	private int value;

	private Color color;

	public NumberRectangle() {
	}

	public NumberRectangle(int x, int y, int value, Color color) {
		this.x = x;
		this.y = y;
		this.color = color;
		this.value = value;

	}

	public void draw(Graphics2D g2) {
		int clientX = 30 + x * 30;
		int clientY = 20 + y * 10;
		Rectangle2D.Double rect = new Rectangle2D.Double(clientX, clientY, 20,
				value * 20);
		g2.setPaint(color);
		g2.fill(rect);
		g2.setPaint(Color.BLACK);
		g2.draw(rect);
		g2.drawString(String.valueOf(value), clientX, clientY - 10);
	}

	/**
	 * @return the color
	 */
	public Color getColor() {
		return color;
	}

	/**
	 * @param color
	 *            the color to set
	 */
	public void setColor(Color color) {
		this.color = color;
	}

	/**
	 * @return the x
	 */
	public int getX() {
		return x;
	}

	/**
	 * @param x
	 *            the x to set
	 */
	public void setX(int x) {
		this.x = x;
	}

	/**
	 * @return the y
	 */
	public int getY() {
		return y;
	}

	/**
	 * @param y
	 *            the y to set
	 */
	public void setY(int y) {
		this.y = y;
	}

	/**
	 * @return the value
	 */
	public int getValue() {
		return value;
	}

	/**
	 * @param value
	 *            the value to set
	 */
	public void setValue(int value) {
		this.value = value;
	}

}


package my.visualization.search.sequencial;

import javax.swing.JFrame;

public class SortApplication {
	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		SequencialSearchVisualizationFrame frame = new SequencialSearchVisualizationFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.show();
	}
}


程序代码也没有优化过,注释也基本上没有加,不好意思。大家如果有其它好的想法,请共享一下哦。
  • 大小: 32.9 KB
  • 大小: 33 KB
  • 大小: 33.7 KB
  • 大小: 33.9 KB
  • 大小: 35.9 KB
  • 大小: 34.6 KB
  • 大小: 38.9 KB
  • 大小: 14.9 KB
0
1
分享到:
评论

相关推荐

    可视化编程实验

    可视化编程是一种将编程过程以图形化的方式展示,使得非专业程序员或者初学者也能更容易地理解和操作编程任务。在这个“可视化编程实验”中,我们将聚焦于一个计算器演示实验,这是一个常见的教学工具,旨在帮助学习...

    VisIt可视化软件用户手册

    ### VisIt可视化软件关键知识点解析 #### 一、VisIt软件简介 - **定义与特点**:VisIt是一款由美国劳伦斯利弗莫尔国家实验室(Lawrence Livermore National Laboratory)开发的强大可视化软件,其主要特点在于免费...

    数据结构 可视化演示软件

    7. **查找算法**:顺序查找、二分查找、哈希查找的原理和效率。 8. **数据结构的优化**:如哈希表的冲突解决策略,二叉查找树的平衡调整。 使用这样的软件,开发者和学习者可以更直观地理解这些复杂的概念,从而...

    BFS和DFS算法可视化(js实现)

    在本项目中,BFS的可视化展示会逐步显示每个节点的访问顺序,以动画形式展示队列如何处理节点,使得学习者能够直观地看到层次性的搜索过程。 ### DFS(深度优先搜索) DFS是一种沿着树的深度遍历,尽可能深地搜索...

    EXCEL可视化数据看板-报销分析表科技风Excel模板.zip

    - 模板中可能包括筛选器和排序功能,允许用户根据需要快速查找特定数据或按特定顺序查看数据。 6. **仪表盘组件**: - 如使用Excel的KPI指示器或仪表盘控件,可以创建可视化指标,如预算执行率,一目了然。 7. *...

    chm可视化的编辑工具

    2. **可视化编辑**: 用户界面直观易用,提供拖放功能,可以方便地调整页面顺序,添加、删除或修改章节内容,无需深入理解CHM文件的内部结构。 3. **样式和布局控制**: 工具可能允许用户自定义CSS样式,以匹配品牌或...

    jsonview可视化工具

    3. **搜索功能**:内置的搜索框允许用户快速查找特定的键或值,这对于大型JSON文件尤其有用。 4. **自定义设置**:JsonView支持自定义颜色主题和字体大小,满足不同用户的个人偏好和视觉需求。 5. **兼容性**:...

    线性表可视化

    在可视化领域,将线性表呈现出来能够帮助我们更好地理解和操作这些数据。"线性表可视化"的应用旨在提供一个直观的交互界面,让用户能够在窗口中直观地进行线性表的增删操作。 线性表的特性: 1. **顺序性**:线性表...

    CSS调试工具,CSS可视化编辑器

    本文将重点讨论CSS调试工具和CSS可视化编辑器,以及它们在提升开发效率和学习过程中的重要作用。 首先,CSS调试工具是Web开发者必不可少的利器,它们帮助开发者识别并修复页面布局和样式问题。这些工具通常集成在...

    btree.zip实现二叉树的可视化处理,很好的源码资料供大家学习。。

    在本资源“btree.zip”中,我们找到了一个关于二叉树可视化的实现,这对于学习和理解二叉树的操作是非常有价值的。本文将深入探讨二叉树的基本概念、MFC框架下的可视化实现以及如何通过源码进行学习。 二叉树是一种...

    (严蔚敏、吴伟民)数据结构配套可视化算法演示系统

    5. **查找算法**:如顺序查找、二分查找、哈希查找。二分查找适用于有序数组,效率高;哈希查找通过散列函数快速定位,实现近似常数时间的查找。 6. **动态规划**:用于解决具有重叠子问题和最优子结构的问题,如...

    hr不懂这几种思维结构化模型你就out了思维可视化的四类模型.docx

    思维可视化是将复杂的思考过程通过图形化的方式展现,帮助人们更好地理解和组织思维,提高工作效率。以下是对四类思维可视化模型的详细阐述: 1. **放射状规整**:这一模型以一个中心点为核心,向外辐射出多个分支...

    zookeeper可视化JAVA工具ZooInspector

    **ZooInspector:Zookeeper的可视化神器** ZooInspector,作为一个基于Java开发的工具,是Zookeeper生态系统中的重要组成部分,专为用户提供了一种直观、易用的界面来探索和管理Zookeeper集群。在IT行业中,...

    算法可视化系列——排序算法——插入排序

    在本系列的“算法可视化”中,我们将深入探讨插入排序的实现及其在实际编程中的应用。 **一、插入排序的基本概念** 插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入...

    数据结构配套可视化算法演示系统

    本书的配套可视化算法演示系统,即"DSDemoC",旨在帮助读者更直观地理解各种数据结构及其操作。 1. **链表**:数据结构中的链表是一种线性结构,不同于数组,它的元素不一定要在内存中连续存储。链表通过指针连接...

    二叉树可视化-程序和代码

    3. **遍历方法**:前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)是二叉树的三种主要遍历方式,它们在可视化中会以不同的顺序展示节点。 4. **平衡策略**:对于平衡二叉树,如AVL树和红黑树,...

    15个实用可视化工具.pptx

    11. **Revisit**:这可能是一个时间轴工具,用于创建和分享历史事件、项目进度或其他按时间顺序排列的内容的可视化。 12. **Google Fusion Tables**:谷歌提供的数据管理和可视化服务,让用户能够轻松整合、存储和...

    B+ Tree 增删改查 可视化

    可视化工具如"B+ Tree"可以帮助理解B+ Tree的结构和操作过程。通过图形化界面,用户可以直观地看到增删改查操作如何影响树的形态,这对于学习和调试非常有帮助。 ### 应用场景 B+ Tree被广泛应用于数据库索引,如...

    模拟电梯系统程序包含可视化界面

    在这个案例中,我们讨论的程序具有可视化界面,使得用户可以通过鼠标操作来直观地与电梯系统进行交互。 首先,我们要知道“VC++”是微软开发的一种集成开发环境,它支持C++编程语言。在这个项目中,开发者选择了...

Global site tag (gtag.js) - Google Analytics