Java
Java的一些笔记
麦克斯韦的妖精
大槐树下一梦醒,人事功名两茫茫。长恨当年花开日,少不更事老来伤。
展开
-
打乱数组
面向对象的课程实验要求做一个Windows纸牌游戏,其中要实现洗牌。我想采用将一个数组打乱的方法来实现。这里采用思想是建一个长为52的数组,然后从前51个中随机选取一个与第52个交换,然后再从前50个中随机选一个与第51个交换, 这样一直下去,整个数组就是一个随机的无序数组了。代码如下:import java.util.Random; public class RandomS原创 2016-10-10 22:57:17 · 512 阅读 · 0 评论 -
基于邻接链表的图的广度优先搜索Java实现
广度优先搜索(BFS)是最简单的图搜索算法之一。给定一个图G=(V,E)和一个源点s,广度优先搜索对图G中的边进行搜索可以发现所有从源结点s到达的所有结点,并且可以计算从源节点s到每个可以到达的结点的最少边数,同时生成一颗“广度优先搜索树”。在《算法导论》一书中,作者用了三种结点的颜色(白色,黑色和灰色)来方便讲解和读者理解。所有的结点在一开始的时候均涂上白色,白色代表尚未发现,灰色代表已经发原创 2017-07-06 19:39:27 · 643 阅读 · 0 评论 -
求解有向图的强联通分量的Java实现
有向图的强联通分量(SCC)是一个最大节点集合,在该结点中满足对于任意一个节点对u和v,同时存在从u到v的路径和从v到u的路径。下图便是一个强联通分量的例子,该图中有4个强联通分量。根据强联通分量的定义,不难得出其一个重要的性质,如果将原图转置,在得到的转置图中,其强联通分量是不变的。其实对一个图中的强联通分量进行合并,就是把一个强联通分量看做是一个等价类将这个等价类合并成一个点,亦或原创 2017-07-06 20:22:02 · 725 阅读 · 0 评论 -
Kruskal算法求解最小生成树的Java实现
假设一个无向图共有V(V>1)个顶点,E条边,那么它的最小生成树(如果有的话)有V个顶点,V-1条边。Krusal算法在求解最小生成树的过程中就是不断地选出一条权重最小的边,如果将这条边插入到目前的最小生成树(此时尚未最终形成)中不形成环路,则将其插入,否则再选择次小边重复以上过程,直到最后最小生成树中有V-1条边,则最小生成树求解成功,否则,原图中不包含最小生成树。下面是《算法导论》一书中的原创 2017-07-06 20:39:26 · 2153 阅读 · 0 评论 -
Prim算法求解最小生成树的Java实现
上一篇既然提到了Krusal算法,这里就不得不说Prim算法了,这两个算法都是求解最小生成树的经典的贪婪算法。与Krusal算法不同的是,Prim算法在求解过程中始终保持临时结果是一颗联通的树。该算法的伪代码如下//假设网络中至少有一个个顶点设T为所选边的集合,初始化T为空设 TV为已在树中的顶点的集合,置TV={1}令E为网络中的边的集合while(E不为空,并且T 中的边数原创 2017-07-06 21:11:15 · 4210 阅读 · 0 评论 -
Dijkstra算法求单源最短路径Java实现
如果所采用的实现方式合适,Dijkstra算法的运行时间要低于前面所说的Bellman_Ford算法,但是Dijkstra算法要求图中没有负边。Dijkstra算法在运行过程中维持的关键信息是一组结点集合S。从源结点s到该集合中每个结点之间的最短路径已经被找到。算法重复从结点集V-S中选择最短路径估计最小的结点u,将u加入到集合S,然后对所有从u发出的边进行松弛(有关松弛操作可见http://bl原创 2017-07-07 10:51:47 · 4377 阅读 · 1 评论 -
Bellman-Ford算法求解单源最短路径Java实现
Bellman-Ford算法解决的是一般情况下的单源最短路径问题,在这里,边的权重可以是负值。如果存在一个从源结点可以到达的权重为负值的环路,则算法将还会告诉我们 不存在解决方案,否则算法将给出最短路径和它们的权重。该算法用到了松弛(relaxation)技术。对于每一个结点v来说,我们维持两个属性,一个是v.d,用来记录从源结点s到结点v的最短路径权重的上界,我们称v.d为s到v的最短路径估计。原创 2017-07-06 21:55:02 · 2427 阅读 · 0 评论 -
Floyd-Warshall算法求解所有结点对的最短路径问题Java和Python实现
其实求解所有结点对之间的最短路径问题完全可以用调用|V|次Bellman-Ford算法或Dijkstra算法来实现,但是那样肯定效率会比较低下。与前面两个算法基于邻接链表不同,本文所要说的Floyd-Warshall算法是基于邻接矩阵的,当然也可以用邻接链表来实现。假设i与j是图中的两个结点,那么它们之间至多经过k个结点的最短路径代价肯定不小于至多经过k+1个结点的最短路径的代价。由此对于所有...原创 2017-07-07 11:17:07 · 3580 阅读 · 0 评论 -
Ford-Fulkerson算法求最大流Java实现
在最大流问题中,我们希望在不违反任何容量限制的情况下,计算出从源结点到汇点的最大流速。对于流网络中的每一个结点,遵守“流量守恒”:除了源结点与汇点之外,流入该结点的速率等于流出该结点的速率。《算法导论》书中所给出的伪代码如下所示:下面是一个求最大流的过程下面是用Java的代码实现:package Ford_Fulkerson;/** * 网络中的边 *原创 2017-07-07 16:31:26 · 3119 阅读 · 0 评论 -
两种求解斐波那契数算法的时间比较
计算斐波那契数最容易理解的一种方法就是递归,具体实现方法如下所示:public static int fib(int n){ if(n<=1) return 1; else return fib(n-1)+fib(n-2); }在这个算法中我们可以得知,运行时间T(n)不小于T(n-1)与T(n-2)之和,所以,该算法的运行时间是指数级增长的。由于计算F(n)只需要F原创 2017-07-18 20:32:37 · 976 阅读 · 0 评论 -
Java在外部类的方法中创建内部类对象
有时候需要在Java的外部类的一个方法中创建一个内部类的对象,下面用一个简单的小例子来说明一种实现方法。public class Out { public Out(){ System.out.println("外部类创建"); } class In{ public In(){ System.out.println("内部类创建"); } } public原创 2017-09-16 19:19:09 · 2922 阅读 · 0 评论 -
一种Java分割字符串的方法
Java的String类有一个split()方法,其返回值为一个String数组,可以用来分割字符串。下面是一个简单的例子,根据空格来分割字符串str并将返回结果保存在数组strs中。public class StringSplit { public static void main(String[] args) { // TODO Auto-generated method stub原创 2017-12-06 10:05:10 · 268 阅读 · 0 评论 -
用栈实现图的深度优先搜索Java实现
《算法导论》一书中给出的深度优搜索是使用递归方式实现的。相比较而言,用递归的方式实现必用非递归方式实现要好理解很多。但是一般而言所有的递归方式实现都可以用非递归方式实现来代替。这里用一个栈结构来代替递归。初始化时将搜索的源节点压入栈中,只要栈不为空,重复以下操作:(1)弹出栈顶元素结点(2)将弹出的栈顶结点的所有邻接后续结点中尚未被发现的结点压入栈中。具体代码实现如下所示/**原创 2017-07-06 19:58:15 · 3506 阅读 · 0 评论 -
Java实现图结构
本学期有一门课程叫做算法分析与设计,用的教材是机械工业出版社的《算法导论》中文版第三版。课程只包括这本书的图算法部分,也就是第22章到第26章的部分,授课老师是郭炅老师,郭老师的水平还是很高的,在这里对郭老师一学期的授课表示感谢。而这几篇关于图算法的博客,就是基于这门课程的实验来进行整理的。我们知道图一般有两种表示方法:邻接链表和邻接矩阵。比如在下图中b与c分别是图a的邻接链表表示和邻接矩阵表原创 2017-07-06 16:59:05 · 2249 阅读 · 0 评论 -
用Java实现栈
其实在一开始,这个小实验是我用来测试Java当中的变量引用的,由于较长时间没写Java项目了,而之前有弄过一段时间的C++,所以对Java的变量引用这一块有点不自信,就写了这么一个小程序来做一下实验。所以连函数名都不是Stack而是QuoteTest。这是一个简单的对栈数据结构的实现。package Test;public class QuoteTest { private N原创 2016-10-13 19:16:45 · 369 阅读 · 0 评论 -
Java实现图片随鼠标拖动
面向对象的实验要实现用鼠标拖动一张纸牌图片。经过相关查询可知要为图片注册事件MouseListener和MouseMotionListener中的mousePressed方法和mouseDragged方法。这里的MyMouseInputAdapter继承了MouseInputAdapter类。对其中的相关的两个方法进行了重写。import java.awt.*;import java.原创 2016-10-14 19:55:22 · 11787 阅读 · 1 评论 -
Java鼠标点击更换图片
要想实现通过监听鼠标点击事件来更换图像。可以通过改写MouseAdapter类中的mouseClicked方法来实现。下面的实例就是通过继承MouseAdapter类,并对mouseClicked()方法进行改写来实现的两个图像交替显示的效果。这里也应用了JLabel类中的setIcon(Icon icon)方法。使用这个方法可以很方便地对JLabel对象所显示的图像进行修改。原创 2016-10-14 22:16:12 · 9441 阅读 · 0 评论 -
一个关于Java子类父类方法执行的小实验
父类如下:public class Rclass { public Rclass(){ } public void a(){ System.out.println("父类a方法"); } public void b(){ System.out.println("父类b方法"); a(); }}子类如下:public class Scl原创 2016-12-07 22:44:30 · 395 阅读 · 0 评论 -
利用Java5泛型特性实现泛型构件——简单的泛型类和接口
当指定一个泛型类时,类的声明则包含一个或多个类型参数,这些参数被放在类名后面的一对尖括号内。/** * 简单泛型类和接口 * @author sdu20 * * @param */public class GenericMemoryCell { private AnyType storedValue; GenericMemoryCell(){ } pub原创 2017-02-17 10:58:13 · 483 阅读 · 0 评论 -
Java List的ArrayList实现
Java的List ADT有两种实现方式ArrayList和LinkedList。ArrayList类提供了一种可增长数组的实现。其优点在于,对get和set的调用花费常数时间,其缺点是插入和删除代价高。下面是一个ArrayList泛型类的实现,为了与类库中的类相区别这里将其命名为MyArrayList。首先概括一下该类的要求:1、保持基础数组,数组的容量以及储存的当前项数。2、提供一种机原创 2017-02-17 16:24:24 · 712 阅读 · 0 评论 -
Java List的LinkedList的实现
Java的List ADT的第二种实现方式是LinkedList。该类提供了List ADT的双链表实现。使用LinkedList的优点在于,插入新项与删除现有的项开销均很小,但是get与set开销较大。在考虑设计方面需要三个类:1、MyLinkedList类本身,需要包含到两端的链、表的大小及一些方法。2、Node类。3、LinkedListIterator实现Iterator接原创 2017-02-18 21:40:46 · 467 阅读 · 0 评论 -
开源爬虫: Heritrix 1.14.4 安装/使用
本文转自:http://blog.sina.com.cn/s/blog_5f54f0be0101hcy8.htmlHeritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。本文详细介绍了 Heritrix 在 Eclipse 中的配置、运行。目前 Heritrix 的转载 2017-04-18 22:42:59 · 1305 阅读 · 0 评论 -
Eclipse中导入Heritrix,报错找不到类 sun.net.www.protocol.file.FileURLConnection
本文转自百度知道:https://zhidao.baidu.com/question/502397085.html按照网上看到的用法导入Heritrix到Eclipse。在Heritrix.java中间中提示有错误 只有这一个。在Heritrix1.14.3配置运行时,出现Error:找不到sun.net.www.protocol.file.FileURLConnection,转载 2017-04-18 22:48:25 · 1738 阅读 · 0 评论 -
eclipse中Tomcat的配置
这篇文章中介绍的比较详细http://blog.csdn.net/u010371710/article/details/51701026可以参考一下。转载 2017-04-25 14:52:29 · 411 阅读 · 0 评论 -
关于Java中交换数组中的两个元素的一个错误笔记
从大一就开始学习Java了,到现在还是经常出现看似低级的错误。端午假期写一道算法题的时候就栽在数组元素交换上了。开始的时候写了一个用于交换的函数:public static void swap(int x,int y){ int z = x; x = y; y = z;}没什么技术含量,就是以前经常使用的借助一个临时的z,来实现x与y的交换。但是当把这个函数应用于下面的nums数原创 2017-06-01 23:02:15 · 3452 阅读 · 0 评论 -
Java调用jama实现矩阵运算
本文转自http://www.cnblogs.com/zangbo/p/5622351.html一、jama简介Jama是一个基本的线性代数java包。包括一个基本的Matrix类和5个矩阵分解类。Matrix类提供了基本的线性代数数值运算的功能,不同的构造函数可以构造双精度和浮点精度的二维数组,而不同的gets和sets方法可以返回子矩阵和矩阵元素。转载 2017-12-06 22:37:46 · 1140 阅读 · 1 评论