java treeset subset_Java中TreeSet的详细用法

第1部分 TreeSet介绍

TreeSet简介

TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet, Cloneable, java.io.Serializable接口。

TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。

TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。

TreeSet 实现了Cloneable接口,意味着它能被克隆。

TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。

TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。

另外,TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。

TreeSet的构造函数

// 默认构造函数。使用该构造函数,TreeSet中的元素按照自然排序进行排列。

TreeSet()

// 创建的TreeSet包含collection

TreeSet(Collection extends E> collection)

// 指定TreeSet的比较器

TreeSet(Comparator super E> comparator)

// 创建的TreeSet包含set

TreeSet(SortedSet set)

TreeSet的API

boolean add(E object)

boolean addAll(Collection extends E> collection)

void clear()

Object clone()

boolean contains(Object object)

E first()

boolean isEmpty()

E last()

E pollFirst()

E pollLast()

E lower(E e)

E floor(E e)

E ceiling(E e)

E higher(E e)

boolean remove(Object object)

int size()

Comparator super E> comparator()

Iterator iterator()

Iterator descendingIterator()

SortedSet headSet(E end)

NavigableSet descendingSet()

NavigableSet headSet(E end, boolean endInclusive)

SortedSet subSet(E start, E end)

NavigableSet subSet(E start, boolean startInclusive, E end, boolean endInclusive)

NavigableSet tailSet(E start, boolean startInclusive)

SortedSet tailSet(E start)

说明:

(01) TreeSet是有序的Set集合,因此支持add、remove、get等方法。

(02) 和NavigableSet一样,TreeSet的导航方法大致可以区分为两类,一类时提供元素项的导航方法,返回某个元素;另一类时提供集合的导航方法,返回某个集合。

lower、floor、ceiling 和 higher 分别返回小于、小于等于、大于等于、大于给定元素的元素,如果不存在这样的元素,则返回 null。

第2部分 TreeSet数据结构

TreeSet的继承关系

java.lang.Object

↳ java.util.AbstractCollection

↳ java.util.AbstractSet

↳ java.util.TreeSet

public class TreeSet extends AbstractSet

implements NavigableSet, Cloneable, java.io.Serializable{}

TreeSet与Collection关系如下图:

fda310881fa08dc915b49ba0e07ae21d.png

从图中可以看出:

(01) TreeSet继承于AbstractSet,并且实现了NavigableSet接口。

(02) TreeSet的本质是一个"有序的,并且没有重复元素"的集合,它是通过TreeMap实现的。TreeSet中含有一个"NavigableMap类型的成员变量"m,而m实际上是"TreeMap的实例"。

第3部分 TreeSet源码解析(基于JDK1.6.0_45)

为了更了解TreeSet的原理,下面对TreeSet源码代码作出分析。

1 package java.util;

2

3 public class TreeSet extends AbstractSet

4 implements NavigableSet, Cloneable, java.io.Serializable

5 {

6 // NavigableMap对象

7 private transient NavigableMap m;

8

9 // TreeSet是通过TreeMap实现的,

10 // PRESENT是键-值对中的值。

11 private static final Object PRESENT = new Object();

12

13 // 不带参数的构造函数。创建一个空的TreeMap

14 public TreeSet() {

15 this(new TreeMap());

16 }

17

18 // 将TreeMap赋值给 "NavigableMap对象m"

19 TreeSet(NavigableMap m) {

20 this.m = m;

21 }

22

23 // 带比较器的构造函数。

24 public TreeSet(Comparator super E> comparator) {

25 this(new TreeMap(comparator));

26 }

27

28 // 创建TreeSet,并将集合c中的全部元素都添加到TreeSet中

29 public TreeSet(Collection extends E> c) {

30 this();

31 // 将集合c中的元素全部添加到TreeSet中

32 addAll(c);

33 }

34

35 // 创建TreeSet,并将s中的全部元素都添加到TreeSet中

36 public TreeSet(SortedSet s) {

37 this(s.comparator());

38 addAll(s);

39 }

40

41 // 返回TreeSet的顺序排列的迭代器。

42 // 因为TreeSet时TreeMap实现的,所以这里实际上时返回TreeMap的“键集”对应的迭代器

43 public Iterator iterator() {

44 return m.navigableKeySet().iterator();

45 }

46

47 // 返回TreeSet的逆序排列的迭代器。

48 // 因为TreeSet时TreeMap实现的,所以这里实际上时返回TreeMap的“键集”对应的迭代器

49 public Iterator descendingIterator() {

50 return m.descendingKeySet().iterator();

51 }

52

53 // 返回TreeSet的大小

54 public int size() {

55 return m.size();

56 }

57

58 // 返回TreeSet是否为空

59 public boolean isEmpty() {

60 return m.isEmpty();

61 }

62

63 // 返回TreeSet是否包含对象(o)

64 public boolean contains(Object o) {

65 return m.containsKey(o);

66 }

67

68 // 添加e到TreeSet中

69 public boolean add(E e) {

70 return m.put(e, PRESENT)==null;

71 }

72

73 // 删除TreeSet中的对象o

74 public boolean remove(Object o) {

75 return m.remove(o)==PRESENT;

76 }

77

78 // 清空TreeSet

79 public void clear() {

80 m.clear();

81 }

82

83 // 将集合c中的全部元素添加到TreeSet中

84 public boolean addAll(Collection extends E> c) {

85 // Use linear-time version if applicable

86 if (m.size()==0 && c.size() > 0 &&

87 c instanceof SortedSet &&

88 m instanceof TreeMap) {

89 SortedSet extends E> set = (SortedSet extends E>) c;

90 TreeMap map = (TreeMap) m;

91 Comparator super E> cc = (Comparator super E>) set.comparator();

92 Comparator super E> mc = map.comparator();

93 if (cc==mc || (cc != null && cc.equals(mc))) {

94 map.addAllForTreeSet(set, PRESENT);

95 return true;

96 }

97 }

98 return super.addAll(c);

99 }

100

101 // 返回子Set,实际上是通过TreeMap的subMap()实现的。

102 public NavigableSet subSet(E fromElement, boolean fromInclusive,

103 E toElement, boolean toInclusive) {

104 return new TreeSet(m.subMap(fromElement, fromInclusive,

105 toElement, toInclusive));

106 }

107

108 // 返回Set的头部,范围是:从头部到toElement。

109 // inclusive是是否包含toElement的标志

110 public NavigableSet headSet(E toElement, boolean inclusive) {

111 return new TreeSet(m.headMap(toElement, inclusive));

112 }

113

114 // 返回Set的尾部,范围是:从fromElement到结尾。

115 // inclusive是是否包含fromElement的标志

116 public NavigableSet tailSet(E fromElement, boolean inclusive) {

117 return new TreeSet(m.tailMap(fromElement, inclusive));

118 }

119

120 // 返回子Set。范围是:从fromElement(包括)到toElement(不包括)。

121 public SortedSet subSet(E fromElement, E toElement) {

122 return subSet(fromElement, true, toElement, false);

123 }

124

125 // 返回Set的头部,范围是:从头部到toElement(不包括)。

126 public SortedSet headSet(E toElement) {

127 return headSet(toElement, false);

128 }

129

130 // 返回Set的尾部,范围是:从fromElement到结尾(不包括)。

131 public SortedSet tailSet(E fromElement) {

132 return tailSet(fromElement, true);

133 }

134

135 // 返回Set的比较器

136 public Comparator super E> comparator() {

137 return m.comparator();

138 }

139

140 // 返回Set的第一个元素

141 public E first() {

142 return m.firstKey();

143 }

144

145 // 返回Set的最后一个元素

146 public E first() {

147 public E last() {

148 return m.lastKey();

149 }

150

151 // 返回Set中小于e的最大元素

152 public E lower(E e) {

153 return m.lowerKey(e);

154 }

155

156 // 返回Set中小于/等于e的最大元素

157 public E floor(E e) {

158 return m.floorKey(e);

159 }

160

161 // 返回Set中大于/等于e的最小元素

162 public E ceiling(E e) {

163 return m.ceilingKey(e);

164 }

165

166 // 返回Set中大于e的最小元素

167 public E higher(E e) {

168 return m.higherKey(e);

169 }

170

171 // 获取第一个元素,并将该元素从TreeMap中删除。

172 public E pollFirst() {

173 Map.Entry e = m.pollFirstEntry();

174 return (e == null)? null : e.getKey();

175 }

176

177 // 获取最后一个元素,并将该元素从TreeMap中删除。

178 public E pollLast() {

179 Map.Entry e = m.pollLastEntry();

180 return (e == null)? null : e.getKey();

181 }

182

183 // 克隆一个TreeSet,并返回Object对象

184 public Object clone() {

185 TreeSet clone = null;

186 try {

187 clone = (TreeSet) super.clone();

188 } catch (CloneNotSupportedException e) {

189 throw new InternalError();

190 }

191

192 clone.m = new TreeMap(m);

193 return clone;

194 }

195

196 // java.io.Serializable的写入函数

197 // 将TreeSet的“比较器、容量,所有的元素值”都写入到输出流中

198 private void writeObject(java.io.ObjectOutputStream s)

199 throws java.io.IOException {

200 s.defaultWriteObject();

201

202 // 写入比较器

203 s.writeObject(m.comparator());

204

205 // 写入容量

206 s.writeInt(m.size());

207

208 // 写入“TreeSet中的每一个元素”

209 for (Iterator i=m.keySet().iterator(); i.hasNext(); )

210 s.writeObject(i.next());

211 }

212

213 // java.io.Serializable的读取函数:根据写入方式读出

214 // 先将TreeSet的“比较器、容量、所有的元素值”依次读出

215 private void readObject(java.io.ObjectInputStream s)

216 throws java.io.IOException, ClassNotFoundException {

217 // Read in any hidden stuff

218 s.defaultReadObject();

219

220 // 从输入流中读取TreeSet的“比较器”

221 Comparator super E> c = (Comparator super E>) s.readObject();

222

223 TreeMap tm;

224 if (c==null)

225 tm = new TreeMap();

226 else

227 tm = new TreeMap(c);

228 m = tm;

229

230 // 从输入流中读取TreeSet的“容量”

231 int size = s.readInt();

232

233 // 从输入流中读取TreeSet的“全部元素”

234 tm.readTreeSet(size, s, PRESENT);

235 }

236

237 // TreeSet的序列版本号

238 private static final long serialVersionUID = -2479143000061671589L;

239 }

总结:

(01) TreeSet实际上是TreeMap实现的。当我们构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。

(02) TreeSet是非线程安全的。

(03) TreeSet实现java.io.Serializable的方式。当写入到输出流时,依次写入“比较器、容量、全部元素”;当读出输入流时,再依次读取。

第4部分 TreeSet遍历方式

4.1 Iterator顺序遍历

for(Iterator iter = set.iterator(); iter.hasNext(); ) {

iter.next();

}

4.2 Iterator顺序遍历

// 假设set是TreeSet对象

for(Iterator iter = set.descendingIterator(); iter.hasNext(); ) {

iter.next();

}

4.3 for-each遍历HashSet

// 假设set是TreeSet对象,并且set中元素是String类型

String[] arr = (String[])set.toArray(new String[0]);

for (String str:arr)

System.out.printf("for each : %s\n", str);

TreeSet不支持快速随机遍历,只能通过迭代器进行遍历!

TreeSet遍历测试程序如下:

1 import java.util.*;

2

3 /**

4 * @desc TreeSet的遍历程序

5 *

6 * @author skywang

7 * @email kuiwu-wang@163.com

8 */

9 public class TreeSetIteratorTest {

10

11 public static void main(String[] args) {

12 TreeSet set = new TreeSet();

13 set.add("aaa");

14 set.add("aaa");

15 set.add("bbb");

16 set.add("eee");

17 set.add("ddd");

18 set.add("ccc");

19

20 // 顺序遍历TreeSet

21 ascIteratorThroughIterator(set) ;

22 // 逆序遍历TreeSet

23 descIteratorThroughIterator(set);

24 // 通过for-each遍历TreeSet。不推荐!此方法需要先将Set转换为数组

25 foreachTreeSet(set);

26 }

27

28 // 顺序遍历TreeSet

29 public static void ascIteratorThroughIterator(TreeSet set) {

30 System.out.print("\n ---- Ascend Iterator ----\n");

31 for(Iterator iter = set.iterator(); iter.hasNext(); ) {

32 System.out.printf("asc : %s\n", iter.next());

33 }

34 }

35

36 // 逆序遍历TreeSet

37 public static void descIteratorThroughIterator(TreeSet set) {

38 System.out.printf("\n ---- Descend Iterator ----\n");

39 for(Iterator iter = set.descendingIterator(); iter.hasNext(); )

40 System.out.printf("desc : %s\n", (String)iter.next());

41 }

42

43 // 通过for-each遍历TreeSet。不推荐!此方法需要先将Set转换为数组

44 private static void foreachTreeSet(TreeSet set) {

45 System.out.printf("\n ---- For-each ----\n");

46 String[] arr = (String[])set.toArray(new String[0]);

47 for (String str:arr)

48 System.out.printf("for each : %s\n", str);

49 }

50 }

运行结果:

---- Ascend Iterator ----

asc : aaa

asc : bbb

asc : ccc

asc : ddd

asc : eee

---- Descend Iterator ----

desc : eee

desc : ddd

desc : ccc

desc : bbb

desc : aaa

---- For-each ----

for each : aaa

for each : bbb

for each : ccc

for each : ddd

for each : eee

第5部分 TreeSet示例

下面通过实例学习如何使用TreeSet

1 import java.util.*;

2

3 /**

4 * @desc TreeSet的API测试

5 *

6 * @author skywang

7 * @email kuiwu-wang@163.com

8 */

9 public class TreeSetTest {

10

11 public static void main(String[] args) {

12 testTreeSetAPIs();

13 }

14

15 // 测试TreeSet的api

16 public static void testTreeSetAPIs() {

17 String val;

18

19 // 新建TreeSet

20 TreeSet tSet = new TreeSet();

21 // 将元素添加到TreeSet中

22 tSet.add("aaa");

23 // Set中不允许重复元素,所以只会保存一个“aaa”

24 tSet.add("aaa");

25 tSet.add("bbb");

26 tSet.add("eee");

27 tSet.add("ddd");

28 tSet.add("ccc");

29 System.out.println("TreeSet:"+tSet);

30

31 // 打印TreeSet的实际大小

32 System.out.printf("size : %d\n", tSet.size());

33

34 // 导航方法

35 // floor(小于、等于)

36 System.out.printf("floor bbb: %s\n", tSet.floor("bbb"));

37 // lower(小于)

38 System.out.printf("lower bbb: %s\n", tSet.lower("bbb"));

39 // ceiling(大于、等于)

40 System.out.printf("ceiling bbb: %s\n", tSet.ceiling("bbb"));

41 System.out.printf("ceiling eee: %s\n", tSet.ceiling("eee"));

42 // ceiling(大于)

43 System.out.printf("higher bbb: %s\n", tSet.higher("bbb"));

44 // subSet()

45 System.out.printf("subSet(aaa, true, ccc, true): %s\n", tSet.subSet("aaa", true, "ccc", true));

46 System.out.printf("subSet(aaa, true, ccc, false): %s\n", tSet.subSet("aaa", true, "ccc", false));

47 System.out.printf("subSet(aaa, false, ccc, true): %s\n", tSet.subSet("aaa", false, "ccc", true));

48 System.out.printf("subSet(aaa, false, ccc, false): %s\n", tSet.subSet("aaa", false, "ccc", false));

49 // headSet()

50 System.out.printf("headSet(ccc, true): %s\n", tSet.headSet("ccc", true));

51 System.out.printf("headSet(ccc, false): %s\n", tSet.headSet("ccc", false));

52 // tailSet()

53 System.out.printf("tailSet(ccc, true): %s\n", tSet.tailSet("ccc", true));

54 System.out.printf("tailSet(ccc, false): %s\n", tSet.tailSet("ccc", false));

55

56

57 // 删除“ccc”

58 tSet.remove("ccc");

59 // 将Set转换为数组

60 String[] arr = (String[])tSet.toArray(new String[0]);

61 for (String str:arr)

62 System.out.printf("for each : %s\n", str);

63

64 // 打印TreeSet

65 System.out.printf("TreeSet:%s\n", tSet);

66

67 // 遍历TreeSet

68 for(Iterator iter = tSet.iterator(); iter.hasNext(); ) {

69 System.out.printf("iter : %s\n", iter.next());

70 }

71

72 // 删除并返回第一个元素

73 val = (String)tSet.pollFirst();

74 System.out.printf("pollFirst=%s, set=%s\n", val, tSet);

75

76 // 删除并返回最后一个元素

77 val = (String)tSet.pollLast();

78 System.out.printf("pollLast=%s, set=%s\n", val, tSet);

79

80 // 清空HashSet

81 tSet.clear();

82

83 // 输出HashSet是否为空

84 System.out.printf("%s\n", tSet.isEmpty()?"set is empty":"set is not empty");

85 }

86 }

运行结果:

TreeSet:[aaa, bbb, ccc, ddd, eee]

size : 5

floor bbb: bbb

lower bbb: aaa

ceiling bbb: bbb

ceiling eee: eee

higher bbb: ccc

subSet(aaa, true, ccc, true): [aaa, bbb, ccc]

subSet(aaa, true, ccc, false): [aaa, bbb]

subSet(aaa, false, ccc, true): [bbb, ccc]

subSet(aaa, false, ccc, false): [bbb]

headSet(ccc, true): [aaa, bbb, ccc]

headSet(ccc, false): [aaa, bbb]

tailSet(ccc, true): [ccc, ddd, eee]

tailSet(ccc, false): [ddd, eee]

for each : aaa

for each : bbb

for each : ddd

for each : eee

TreeSet:[aaa, bbb, ddd, eee]

iter : aaa

iter : bbb

iter : ddd

iter : eee

pollFirst=aaa, set=[bbb, ddd, eee]

pollLast=eee, set=[bbb, ddd]

set is empty

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql执行有时候快有时候慢_如何让你的 SQL 执行的飞起?

OR 不能瞎用午饭间的小 C,答应着一起吃饭,却眼不离屏。我知道准是上午人甲产品经理又来了一个脏活。话说 SQL 程序员本身是个光荣的职业,顷刻间百万数据、百亿金额从指间流过,心都不带咯噔的。在心如止水的 SQL 编码师眼里&#x…

binaryformatter java_Java,C#使用二进制序列化、反序列化操作数据

java使用二进制序列化、反序列化的操作首先,要引入java.io下面相关包,或者直接写import java.io.*;下面,为了书写操作的方便,采用复制文件,和throws声明异常的方式来写public void test6() throws IOException {byte[]…

未备案域名临时跳过备案提示_做好了网页,有域名和服务器,还要怎么搭建网站?...

不知道你选择的服务器是国内大陆的还是国外或者香港的,如果是国内大陆的服务器我们的网站域名还需要备案,你的服务器提供商是那家就在那家备案,备案流程跟着提示走就可以了,接下来我们开始正式进入将网站三要素(域名、…

python怎么退出help_(转)python中如何使用help命令?

查看python所有的modules:help("modules")单看python所有的modules中包含指定字符串的modules: help("modules yourstr")查看python中常见的topics: help("topics")查看python标准库中的module:imp…

louvain算法_单细胞聚类(四)图解Leiden算法对Louvain算法的优化

Louvain算法是目前单细胞分析中最常用的聚类算法[1],Seurat/Scanpy/RaceID等单细胞分析工具都默认louvain算法。6天前HumanCell Atlas(HCA)团队发表在Nature Method上的单细胞分析流程中[2],默认的聚类算法是scran包的方法:细胞间权重基于排序…

java 动态绑定原理_详解Java动态绑定机制的内幕(图)

在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。静态绑定机制//被调用的类package hr.test;class Fath…

python重新加载模块_jupyter实现重新加载模块

最近几年,jupyter在全球数据科学领域,已经成为不可或缺的重要工具。在jupyter中用python写程序,若import了自己写的外部模块,如果这个外部模块有更新,再次执行import,jupyter是不会重新导入的。一般的做法是…

java连接access2013数据库_滴水穿石–Java连接Access数据库及其操作

1、配置数据源【控制面板】—>【管理工具】—>【数据源ODBC】点击添加选择Microsoft Access Driver填写数据源名(自定义,如test),并选择数据库(指定你的Access数据库文件),如下图红色箭头标注最后,点击确定数据源配置完成2、…

python抠透明图_python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图

因为最近在做深度学习抠图,正好要用到蒙版进行抠图,所以我将抠图代码进行了封装注释,可以直接使用。可能走了弯路,若有高见请一定提出!主要代码import cv2from PIL import Imageimport numpy as npclass UnsupportedFo…

java退出不报异常_如何优雅的处理异常(java)?

这篇文章应该可以解答你的疑问。Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错?在哪出的错?为什么出错?在有效使…

无法复制winevt中的文件_u盘文件无法复制怎么解决 u盘文件无法复制解决方法【详细步骤】...

在使用u盘的过程中有时会出现 文件无法复制 的问题,并且会弹出磁盘已满的提示,而经过检查,u盘容量却拥有足够大的空间,那么此时该如何解决呢?接下来就跟着小编学习如何解决 u盘文件无法复制 的问题。u盘文件无法复制并提示磁盘已…

python 接口测试 url_Python 接口测试之接口请求方法封装

引言前面讲过三篇文章:既然我们接口测试用例写好了,测试数据也拿到了,那么就是模拟调用接口的方法了,方法有get,post,put,delete,具体是选择哪种,我们需要根据不同接口规定好请求方法来调用。为了方便&…

jenkins 项目启动日志_jenkins 修改启动文件即jdk路径、log路径和切换jenkins用户

环境操作系统: win7服务器(虚拟机):centos6.5(7)工具:CRT提前条件已经安装好了jenkins修改(或者说添加)jdk路径sudo vim /etc/init.d/jenkins# jenkins的版本是2.8candidates" /usr/programe_files/jdk1.8.0_121/bin/java /etc/alternat…

python3远程连接_Python3 SSH远程连接服务器的方法示例

下载paramiko首先,我的windows系统上有python2和python3。使用下面命令切换到python3:activate py3接着使用下面命令下载相关模块:pip install ecdsapip install Cryptopip install paramiko连接服务器操作:# -*- coding: utf-8 -*-import pa…

java jar 环境变量_java-jar jar包带环境变量(参数)启动

需求java工程我们可以编译成jar也可以翻译成war,一般地,war包我会丢到tomcat容器里,启动tomcat来访问服务,端口、SSL证书、日志等等,都托给tomcat。如果打的是jar包,我通常会用nohup启动,比如生…

java单列_Java 单例模式

单例模式保证一个类只有一个实例,并且提供一个访问该实例的全局访问点常见的应用场景:任务管理器。回收站。网站的计数器。操作系统的文件系统。在servlet编程中,每个servlet也是单例模式,项目中,读取配置文件的类&…

python字符串索引必须是整数_TypeError:在Python中,字符串索引必须是整数

我想从currency converter API得到的Json响应中获取key和value,得到一个错误:“of string index must be integers”。下面是Python代码、Json中的数据和错误消息。在import jsonfrom urllib.request import urlopenwith urlopen ("http://free.cur…

java 数字图片识别_java – 识别图像中的数字

您很可能需要执行以下操作:>在整个页面上应用Hough Transform算法,这应该会产生一系列页面部分。>对于您获得的每个部分,请再次应用。如果当前部分产生2个元素,那么你应该处理类似于上面的矩形。>完成后,您可…

python的基础命令_Python必学之命令行常用的命令

打开命令行,我们会看到每行前面都有诸如C:\Documents and Settings\Crossin>或者MyMacBook:~ crossin$之类的。这个提示符表示了当前命令行所在目录。在这里,我们输入python就可以进入python环境了。但今天我们暂时不这么做。第一个常用的命令是&…

内存泄漏java例子_一次线上Java应用内存泄漏分析实例

由于JVM的内存管理采用GC垃圾自动回收机制,这使得Java程序员在编程的时候确实可以从内存管理中释放出来,但这也引发了另外一个大问题,一旦Java应用出现内存泄漏的时候,常常让人措手不及,陷入无从下手的尴尬境地&#x…