-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1372 lines (949 loc) · 354 KB
/
index.html
File metadata and controls
1372 lines (949 loc) · 354 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
<meta charset="utf-8">
<title>Gorge</title>
<!-- keywords -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:type" content="website">
<meta property="og:title" content="Gorge">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="Gorge">
<meta property="og:locale" content="default">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Gorge">
<link rel="alternative" href="/atom.xml" title="Gorge" type="application/atom+xml">
<link rel="icon" href="http://7xkj1z.com1.z0.glb.clouddn.com/head.jpg">
<link rel="stylesheet" href="/css/style.css">
<script src="//cdn.bootcss.com/require.js/2.3.2/require.min.js"></script>
<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn1.lncld.net/static/js/av-core-mini-0.6.1.js"></script>
<script>AV.initialize("your app_id", "your app_key");</script>
<script src="/js/Counter.js"></script>
</head></html>
<body>
<div id="container">
<div id="particles-js"></div>
<div class="left-col">
<div class="overlay"></div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/" class="profilepic">
<img lazy-src="../../photo/head.jpeg" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/">He Zhang</a></h1>
</hgroup>
<p class="header-subtitle">欢迎如此聪明的你来到Gorge的知识星球~~</p>
<div class="switch-btn">
<div class="icon">
<div class="icon-ctn">
<div class="icon-wrap icon-house" data-idx="0">
<div class="birdhouse"></div>
<div class="birdhouse_holes"></div>
</div>
<div class="icon-wrap icon-ribbon hide" data-idx="1">
<div class="ribbon"></div>
</div>
<div class="icon-wrap icon-link hide" data-idx="2">
<div class="loopback_l"></div>
<div class="loopback_r"></div>
</div>
</div>
</div>
<div class="tips-box hide">
<div class="tips-arrow"></div>
<ul class="tips-inner">
<li>菜单</li>
<li>标签</li>
<li>友情链接</li>
</ul>
</div>
</div>
<div class="switch-area">
<div class="switch-wrap">
<section class="switch-part switch-part1">
<nav class="header-menu">
<ul>
<li><a href="/">主页</a></li>
<li><a href="/archives">所有文章</a></li>
<li><a href="https://me.csdn.net/qq_39536716">CSDN</a></li>
</ul>
</nav>
<nav class="header-nav">
<div class="social">
<a class="zhihu" target="_blank" href="/1660047480" title="zhihu">zhihu</a>
<a class="mail" target="_blank" href="/1660047480@qq.com" title="mail">mail</a>
<a class="qq" target="_blank" href="/1660047480@qq.com" title="qq">qq</a>
<a class="weibo" target="_blank" href="/1660047480@qq.com" title="weibo">weibo</a>
</div>
</nav>
</section>
<section class="switch-part switch-part2">
<div class="widget tagcloud" id="js-tagcloud">
</div>
</section>
<section class="switch-part switch-part3">
<div id="js-friends">
<a target="_blank" class="main-nav-link switch-friends-link" href="https://github.com/smackgg/hexo-theme-smackdown">smackdown</a>
</div>
</section>
</div>
</div>
</header>
</div>
</div>
<div class="mid-col">
<nav id="mobile-nav">
<div class="overlay">
<div class="slider-trigger"></div>
<h1 class="header-author js-mobile-header hide">He Zhang</h1>
</div>
<div class="intrude-less">
<header id="header" class="inner">
<div class="profilepic">
<img lazy-src="../../photo/head.jpg" class="js-avatar">
</div>
<hgroup>
<h1 class="header-author">He Zhang</h1>
</hgroup>
<p class="header-subtitle">欢迎呀</p>
<nav class="header-menu">
<ul>
<li><a href="/">主页</a></li>
<li><a href="/archives">所有文章</a></li>
<li><a href="https://me.csdn.net/qq_39536716">CSDN</a></li>
<div class="clearfix"></div>
</ul>
</nav>
<nav class="header-nav">
<div class="social">
<a class="zhihu" target="_blank" href="/1660047480" title="zhihu">zhihu</a>
<a class="mail" target="_blank" href="/1660047480@qq.com" title="mail">mail</a>
<a class="qq" target="_blank" href="/1660047480@qq.com" title="qq">qq</a>
<a class="weibo" target="_blank" href="/1660047480@qq.com" title="weibo">weibo</a>
</div>
</nav>
</header>
</div>
</nav>
<div class="body-wrap">
<article id="post-Ad Hoc(二)" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/03/30/Ad Hoc(二)/" class="article-date">
<time datetime="2021-03-30T04:06:09.050Z" itemprop="datePublished">2021-03-30</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/03/30/Ad Hoc(二)/">
Ad Hoc(二)
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="社区检测"><a href="#社区检测" class="headerlink" title="社区检测"></a>社区检测</h2><p>上面我们已经有了每条船之间的熟悉度的公式,也就是每条船已经建立起来了联系,接下来我们就要使用已有的熟悉度,对现有的船进行社区的识别。</p>
<h3 id="社区检测算法LOUVain"><a href="#社区检测算法LOUVain" class="headerlink" title="社区检测算法LOUVain"></a>社区检测算法LOUVain</h3><p>参考论文:《Fast unfolding of communities in large networks》<br>参考链接:<a href="https://blog.csdn.net/xsqlx/article/details/79078867" target="_blank" rel="noopener">算法原理</a><br>开发环境:anaconda<br>官方文档:<a href="https://python-louvain.readthedocs.io/en/latest/api.html" target="_blank" rel="noopener">API</a><br>语言:python<br>安装依赖包:<code>conda install python-louvain</code></p>
<h4 id="安装完成后,来运行一个实例"><a href="#安装完成后,来运行一个实例" class="headerlink" title="安装完成后,来运行一个实例"></a>安装完成后,来运行一个实例</h4><p>包名是community,但在pypi上引用python louvain<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> community <span class="keyword">as</span> community_louvain</span><br><span class="line"><span class="keyword">import</span> matplotlib.cm <span class="keyword">as</span> cm</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> networkx <span class="keyword">as</span> nx</span><br><span class="line"></span><br><span class="line"><span class="comment"># load the karate club graph</span></span><br><span class="line">G = nx.karate_club_graph()</span><br><span class="line"></span><br><span class="line"><span class="comment"># compute the best partition</span></span><br><span class="line">partition = community_louvain.best_partition(G)</span><br><span class="line"></span><br><span class="line"><span class="comment"># draw the graph</span></span><br><span class="line">pos = nx.spring_layout(G)</span><br><span class="line"><span class="comment"># color the nodes according to their partition</span></span><br><span class="line">cmap = cm.get_cmap(<span class="string">'viridis'</span>, max(partition.values()) + <span class="number">1</span>)</span><br><span class="line">nx.draw_networkx_nodes(G, pos, partition.keys(), node_size=<span class="number">40</span>,</span><br><span class="line"> cmap=cmap, node_color=list(partition.values()))</span><br><span class="line">nx.draw_networkx_edges(G, pos, alpha=<span class="number">0.5</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure></p>
<p>会显示图片:<br><img src="https://img-blog.csdnimg.cn/20201201175100309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">community.best_partition(graph, partition=<span class="literal">None</span>, weight=<span class="string">'weight'</span>, resolution=<span class="number">1.0</span>, randomize=<span class="literal">None</span>, random_state=<span class="literal">None</span>)</span><br></pre></td></tr></table></figure>
<p>使用Louvain启发式计算最大化模块化的图节点的划分(或尝试…)<br>这是最高模块化的划分,也就是由Louvain算法生成的树状图的最高划分。<br>返回 字典,分区(节点:对应的社区编号),社区编号从0到社区数<br>系数</p>
<ul>
<li><p>graph networkx.Graph<br>分解后的networkx图<br>对于neworkx.Graph图,这个我也是真的很无语了(哈哈哈)<br>先来看一下官方的解读吧<a href="https://networkx.org/documentation/stable/reference/generators.html" target="_blank" rel="noopener">图相关的学习链接</a><br>官方应该是提供了一部分的测试用例,来帮助你生成一部分图。<br>但是我们要将自己的数据填充到里面去,我们就需要自己生成一个<a href="https://zhuanlan.zhihu.com/p/135435070" target="_blank" rel="noopener">networkx.Graph</a>图</p>
<ul>
<li>首先,创建一个空的图<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">G = nx.Graph()</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>然后向空图中添加一些节点:</p>
</li>
</ul>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#单个节点的添加</span></span><br><span class="line">G.add_node(<span class="string">'1'</span>)</span><br><span class="line"><span class="comment">#通过一个节点集合添加</span></span><br><span class="line">G.add_nodes_from([<span class="string">'2'</span>, <span class="string">'3'</span>])</span><br><span class="line"><span class="comment">#添加没有权重的边</span></span><br><span class="line">G.add_edge(n1, n2, object=x)</span><br><span class="line">G.add_edges_from([(<span class="string">'1'</span>, <span class="string">'2'</span>), (<span class="string">'1'</span>, <span class="string">'3'</span>)])</span><br><span class="line"><span class="comment">#添加一个带有权重的边</span></span><br><span class="line">G.add_weighted_edges_from([(<span class="number">1</span>, <span class="number">2</span>, <span class="number">0.125</span>), (<span class="number">1</span>, <span class="number">3</span>, <span class="number">0.75</span>), (<span class="number">2</span>, <span class="number">4</span>, <span class="number">1.2</span>), (<span class="number">3</span>, <span class="number">4</span>, <span class="number">0.375</span>)])</span><br></pre></td></tr></table></figure>
<ul>
<li>partition dict, optiona<br>算法将开始使用这个节点分区。这是一个字典,其中键是它们的节点,值是社区</li>
<li>weight:str, optional<br>图中用作权重的键。默认为“权重”</li>
<li>resolution:double, optional<br>会改变社区的大小<ul>
<li>randomize:boolean, optional<br>将随机化节点评估顺序和社区评估顺序,以在每次调用时获得不同的分区</li>
<li>random_state:int, RandomState instance or None, optional (default=None)<br>如果int,random_state是随机数生成器使用的种子;如果RandomState实例,random_state是随机数生成器;如果没有,则random number generator是使用的RandomState实例np.随机.<h4 id="将我们的数据分别填充进两个列表中去"><a href="#将我们的数据分别填充进两个列表中去" class="headerlink" title="将我们的数据分别填充进两个列表中去"></a>将我们的数据分别填充进两个列表中去</h4></li>
</ul>
</li>
</ul>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">shipid = open(<span class="string">"/Users/gorge/Desktop/newshipData/out/r1_shipid.txt"</span>)</span><br><span class="line">rela = open(<span class="string">"/Users/gorge/Desktop/newshipData/out/r1_relation.txt"</span>);</span><br><span class="line">links_data = []</span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> rela.readlines():</span><br><span class="line"> dataline = line.strip(<span class="string">'\n'</span>).split(<span class="string">"["</span>)[<span class="number">0</span>].split(<span class="string">" "</span>)</span><br><span class="line"> famil=<span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> str(dataline[<span class="number">2</span>])!=<span class="string">'0'</span>:</span><br><span class="line"> shijian = line.strip(<span class="string">'\n'</span>).split(<span class="string">"["</span>)[<span class="number">1</span>][:<span class="number">-1</span>].split(<span class="string">","</span>)</span><br><span class="line"> <span class="comment">#先算一个总的时间T</span></span><br><span class="line"> T=<span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> a <span class="keyword">in</span> shijian:</span><br><span class="line"> <span class="keyword">if</span> a!=<span class="string">''</span>:</span><br><span class="line"> T=T+(int(a.strip(<span class="string">" "</span>)))</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> shijian:</span><br><span class="line"> <span class="keyword">if</span> x!=<span class="string">''</span>:</span><br><span class="line"> yy = int(a.strip(<span class="string">" "</span>))</span><br><span class="line"> famil=(famil+(yy**<span class="number">2</span>/T))</span><br><span class="line"> links_data.append((str(dataline[<span class="number">0</span>]), str(dataline[<span class="number">1</span>]), round(famil,<span class="number">2</span>)))</span><br><span class="line"></span><br><span class="line">nodes_data = []</span><br><span class="line">G = nx.Graph()</span><br><span class="line">dataline2 = shipid.readlines()[<span class="number">0</span>].split(<span class="string">" "</span>)</span><br><span class="line"><span class="keyword">for</span> id_q <span class="keyword">in</span> dataline2:</span><br><span class="line"> <span class="keyword">if</span> str(id_q)!=<span class="string">''</span>:</span><br><span class="line"> nodes_data.append(str(id_q))</span><br></pre></td></tr></table></figure>
<h4 id="将添加好的边以及边之间的关系进行添加"><a href="#将添加好的边以及边之间的关系进行添加" class="headerlink" title="将添加好的边以及边之间的关系进行添加"></a>将添加好的边以及边之间的关系进行添加</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">G.add_nodes_from(nodes_data)</span><br><span class="line">G.add_weighted_edges_from(links_data)</span><br></pre></td></tr></table></figure>
<h4 id="使用算法进行社区的区分"><a href="#使用算法进行社区的区分" class="headerlink" title="使用算法进行社区的区分"></a>使用算法进行社区的区分</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">partition = community_louvain.best_partition(G)</span><br></pre></td></tr></table></figure>
<h4 id="其他的一些参数设置"><a href="#其他的一些参数设置" class="headerlink" title="其他的一些参数设置"></a>其他的一些参数设置</h4><ul>
<li>补充一下字典中的初始化 函数<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">comm.fromkeys([str(i) <span class="keyword">for</span> i <span class="keyword">in</span> range(max(partition.values())+<span class="number">1</span>)],[])</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>使用from keys 这个函数第一个参数为 默认的key值,第二个值为默认的value的值<br>在使用过程中发现,默认的value值如果为列表对象的话,初始值的设置为同一个对象,也就是说底层的指针,指向同一个地址</p>
<ul>
<li>louvain中的模块度<br>因为我们的实在需要一个评价社区划分的一个标准,经过查找资料发现,模块度可以用来评判社区检测的结果。<br>因为louvain本来就是通过模块度的增益分社区的, 通过阅读community的源码,找到了对模块度的定义。<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">modularity</span><span class="params">(partition, graph, weight=<span class="string">'weight'</span>)</span>:</span></span><br><span class="line"> <span class="string">"""Compute the modularity of a partition of a graph</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> Parameters</span></span><br><span class="line"><span class="string"> ----------</span></span><br><span class="line"><span class="string"> partition : dict</span></span><br><span class="line"><span class="string"> the partition of the nodes, i.e a dictionary where keys are their nodes</span></span><br><span class="line"><span class="string"> and values the communities</span></span><br><span class="line"><span class="string"> graph : networkx.Graph</span></span><br><span class="line"><span class="string"> the networkx graph which is decomposed</span></span><br><span class="line"><span class="string"> weight : str, optional</span></span><br><span class="line"><span class="string"> the key in graph to use as weight. Default to 'weight'</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> Returns</span></span><br><span class="line"><span class="string"> -------</span></span><br><span class="line"><span class="string"> modularity : float</span></span><br><span class="line"><span class="string"> The modularity</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> Raises</span></span><br><span class="line"><span class="string"> ------</span></span><br><span class="line"><span class="string"> KeyError</span></span><br><span class="line"><span class="string"> If the partition is not a partition of all graph nodes</span></span><br><span class="line"><span class="string"> ValueError</span></span><br><span class="line"><span class="string"> If the graph has no link</span></span><br><span class="line"><span class="string"> TypeError</span></span><br><span class="line"><span class="string"> If graph is not a networkx.Graph</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> References</span></span><br><span class="line"><span class="string"> ----------</span></span><br><span class="line"><span class="string"> .. 1. Newman, M.E.J. & Girvan, M. Finding and evaluating community</span></span><br><span class="line"><span class="string"> structure in networks. Physical Review E 69, 26113(2004).</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> Examples</span></span><br><span class="line"><span class="string"> --------</span></span><br><span class="line"><span class="string"> >>> import community as community_louvain</span></span><br><span class="line"><span class="string"> >>> import networkx as nx</span></span><br><span class="line"><span class="string"> >>> G = nx.erdos_renyi_graph(100, 0.01)</span></span><br><span class="line"><span class="string"> >>> partition = community_louvain.best_partition(G)</span></span><br><span class="line"><span class="string"> >>> modularity(partition, G)</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> graph.is_directed():</span><br><span class="line"> <span class="keyword">raise</span> TypeError(<span class="string">"Bad graph type, use only non directed graph"</span>)</span><br><span class="line"></span><br><span class="line"> inc = dict([])</span><br><span class="line"> deg = dict([])</span><br><span class="line"> links = graph.size(weight=weight)</span><br><span class="line"> <span class="keyword">if</span> links == <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"A graph without link has an undefined modularity"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> node <span class="keyword">in</span> graph:</span><br><span class="line"> com = partition[node]</span><br><span class="line"> deg[com] = deg.get(com, <span class="number">0.</span>) + graph.degree(node, weight=weight)</span><br><span class="line"> <span class="keyword">for</span> neighbor, datas <span class="keyword">in</span> graph[node].items():</span><br><span class="line"> edge_weight = datas.get(weight, <span class="number">1</span>)</span><br><span class="line"> <span class="keyword">if</span> partition[neighbor] == com:</span><br><span class="line"> <span class="keyword">if</span> neighbor == node:</span><br><span class="line"> inc[com] = inc.get(com, <span class="number">0.</span>) + float(edge_weight)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> inc[com] = inc.get(com, <span class="number">0.</span>) + float(edge_weight) / <span class="number">2.</span></span><br><span class="line"></span><br><span class="line"> res = <span class="number">0.</span></span><br><span class="line"> <span class="keyword">for</span> com <span class="keyword">in</span> set(partition.values()):</span><br><span class="line"> ss = (inc.get(com, <span class="number">0.</span>) / links) - \</span><br><span class="line"> (deg.get(com, <span class="number">0.</span>) / (<span class="number">2.</span> * links)) ** <span class="number">2</span></span><br><span class="line"> print(ss)</span><br><span class="line"> res += ss</span><br><span class="line"> print(res)</span><br><span class="line"> <span class="keyword">return</span> res</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>我们可以通过将源码直接下载下来使用,为了保持文件的结构,我这里使用的是pycharm进行编辑的。<br>有了源码,其实我们也可以通过已经安装的community_louvain进行调用<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cxc = community_louvain.modularity(partition, G)</span><br><span class="line">print(<span class="string">"社区的模块度为:"</span>,cxc)</span><br></pre></td></tr></table></figure></p>
<p>这个函数一共有两个参数,上面源码中介绍的已经很清楚了<br>partition 为已经分出来的社区,<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{<span class="string">'66660'</span>: <span class="number">0</span>, <span class="string">'55555'</span>: <span class="number">1</span>, <span class="string">'53995'</span>: <span class="number">2</span>, <span class="string">'12912'</span>: <span class="number">3</span>, <span class="string">'25417'</span>: <span class="number">4</span>, <span class="string">'68714'</span>: <span class="number">5</span>, <span class="string">'65773'</span>: <span class="number">5</span>, <span class="string">'50698'</span>: <span class="number">6</span>, <span class="string">'46344'</span>: <span class="number">1</span>, <span class="string">'29743'</span>: <span class="number">1</span>, <span class="string">'25510'</span>: <span class="number">7</span>, <span class="string">'11669'</span>: <span class="number">3</span>, <span class="string">'48048'</span>: <span class="number">6</span>, <span class="string">'59550'</span>: <span class="number">8</span>, <span class="string">'61259'</span>: <span class="number">9</span>, <span class="string">'46705'</span>: <span class="number">0</span>, <span class="string">'56825'</span>: <span class="number">3</span>, <span class="string">'14418'</span>: <span class="number">3</span>, <span class="string">'50140'</span>: <span class="number">3</span>, <span class="string">'66883'</span>: <span class="number">3</span>, <span class="string">'26371'</span>: <span class="number">4</span>, <span class="string">'47501'</span>: <span class="number">1</span>, <span class="string">'49980'</span>: <span class="number">1</span>, <span class="string">'31548'</span>: <span class="number">6</span>, ...}</span><br></pre></td></tr></table></figure></p>
<p>partion是根据 {节点id : 社区名}进行标记社区的<br>G为输入的networkx graph图<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">G = nx.Graph()</span><br><span class="line">其中G包括两部分组成:</span><br><span class="line">节点的集合</span><br><span class="line">[<span class="string">'66660'</span>, <span class="string">'55555'</span>, <span class="string">'53995'</span>, <span class="string">'12912'</span>, ...]</span><br><span class="line">节点之间关系的集合</span><br><span class="line">[(<span class="string">'66660'</span>, <span class="string">'31602'</span>, <span class="number">15.0</span>), (<span class="string">'66660'</span>, <span class="string">'66140'</span>, <span class="number">1.95</span>), (<span class="string">'66660'</span>, <span class="string">'41621'</span>, <span class="number">10.14</span>),...]</span><br><span class="line">其中第一个元组代表的意思是 节点<span class="number">66660</span>与节点<span class="number">31602</span>的熟悉度为<span class="number">15.0</span></span><br></pre></td></tr></table></figure></p>
<p>因此,在使用同一批进行</p>
<h3 id="社区可视化"><a href="#社区可视化" class="headerlink" title="社区可视化"></a>社区可视化</h3><p>现在社区已经分出来了,使用python的库 networkx也可以画出社区关系图,但是画出来的图如下:<br><img src="https://img-blog.csdnimg.cn/20201205224558739.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>这个图是静态的,而且数据多了之后,可以发现区分的不是很明显,而且不能直观的表示出点的标签(这一部分我暂时没有探索出来,所以我就换了一个工具进行可视化处理)</p>
<h3 id="Echarts"><a href="#Echarts" class="headerlink" title="Echarts"></a>Echarts</h3><p>这是一个基于we b界面的可视化工具,在之前的记录中,也有提及过。这个画出来的模板是<br><img src="https://img-blog.csdnimg.cn/20201205224843274.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>可以看出来,这个图片看起来更友好一些,这里因为只能展示静态的图片,这个其实是一个动态的,当鼠标放在每个点上可以显示当前点的信息,而且更清晰一些。</p>
<h4 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h4><p>我这里使用的是webstrom 进行编辑的</p>
<h4 id="需要引入的文件"><a href="#需要引入的文件" class="headerlink" title="需要引入的文件"></a>需要引入的文件</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/js/echarts.min.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/echarts/dist/extension/dataTool.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br></pre></td></tr></table></figure>
<ul>
<li><p>其中echarts.min.js的生成是由Echarts的官网进行定制的,我们可以登陆echarts的官网,然后点击下载按钮,选择在线定制,选择自己要定制的图表,然后在下面点击下载即可。<br><img src="https://img-blog.csdnimg.cn/20201205225427547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>出现这个界面就表明定制成功了。</p>
</li>
<li><p>对于query.min.js 大家可以使用在线的,直接使用上面的链接就可以了,这样就要保证在有网络的情况下使用,也可以去官网下载jquery.min.js的文件,这是j query所必须的依赖文件。</p>
</li>
<li>datatool.js 这个是我在下载echarts的包的时候就已经有了的。这个包的具体操作有点记不清楚了。很久之前做的。</li>
</ul>
<h4 id="数据格式"><a href="#数据格式" class="headerlink" title="数据格式"></a>数据格式</h4><p>这个图使用的是json这个数据格式<br>解读一下:</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line">"type": "force",</span><br><span class="line"> "categories": [{</span><br><span class="line"> "name": "HTMLElement",</span><br><span class="line"> "keyword": {},</span><br><span class="line"> "base": "HTMLElement"</span><br><span class="line"> }]</span><br><span class="line"> "nodes": [</span><br><span class="line"> {</span><br><span class="line"> "name": "AnalyserNode",</span><br><span class="line"> "value": 1,</span><br><span class="line"> "category": 4</span><br><span class="line"> }]</span><br><span class="line"> "links": [</span><br><span class="line"> {</span><br><span class="line"> "source": 169,</span><br><span class="line"> "target": 137</span><br><span class="line"> }</span><br><span class="line"> ]</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<p>我上面只是举了一个例子<br>可以发现先是categories 表示社区的类别,每个社区的名称是什么,name的作用是显示标签用的,base是用来点击社区的一个成员的时候显示用的。<br>nodes 是社区的点,name是社区成员的名字,value 是用来显示该成员的权重,category是用来显示该成员是属于哪一个社区的,该项的值从0 - n表示上面分类的index<br>links 是表示社区成员之间是不是有关系,source源,target 目标节点,同样的道理他们对应的值 为nodes的index的值。<br>因此,我们如果想要使用这个工具,我们还需要自己写一个数据的转换工具。</p>
<h3 id="数据的转换工具"><a href="#数据的转换工具" class="headerlink" title="数据的转换工具"></a>数据的转换工具</h3><p>分类格式的转换<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">comm = {}</span><br><span class="line"><span class="comment">#comm = comm.fromkeys([str(i) for i in range(max(partition.values())+1)],[])</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(max(partition.values())+<span class="number">1</span>):</span><br><span class="line"> comm[i] = []</span><br><span class="line"><span class="keyword">for</span> key,values <span class="keyword">in</span> partition.items():</span><br><span class="line"> comm[values].append(key)</span><br><span class="line"><span class="comment"># for key,values in comm.items():</span></span><br><span class="line"><span class="comment"># print("第",key,"个社区,成员个数为",len(values),"成员为",values)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 将数据转换为json格式</span></span><br><span class="line"><span class="comment"># 分类</span></span><br><span class="line">categories = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(len(comm)):</span><br><span class="line"> sc = {}</span><br><span class="line"> sc[<span class="string">"name"</span>]=i</span><br><span class="line"> sc[<span class="string">"keyword"</span>]={}</span><br><span class="line"> sc[<span class="string">"base"</span>] = i</span><br><span class="line"> categories.append(sc)</span><br><span class="line">print(categories)</span><br></pre></td></tr></table></figure></p>
<p>节点格式的转换</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 节点的转换</span></span><br><span class="line">json_nodes = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> nodes_data:</span><br><span class="line"> sc = {}</span><br><span class="line"> sc[<span class="string">"name"</span>]= i;</span><br><span class="line"> sc[<span class="string">"value"</span>]=<span class="number">1</span></span><br><span class="line"> sc[<span class="string">"category"</span>]= partition[i]</span><br><span class="line"> json_nodes.append(sc)</span><br></pre></td></tr></table></figure>
<p>节点关系的转换<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">json_links = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> links_data:</span><br><span class="line"> sc = {}</span><br><span class="line"> sc[<span class="string">"source"</span>] = ship_idmap[i[<span class="number">0</span>]]</span><br><span class="line"> sc[<span class="string">"target"</span>] = ship_idmap[i[<span class="number">1</span>]]</span><br><span class="line"> json_links.append(sc)</span><br></pre></td></tr></table></figure></p>
<p>数据以json的格式进行存储</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">ww = open(<span class="string">"/Users/gorge/Desktop/www.json"</span>,<span class="string">"a"</span>)</span><br><span class="line">jsonxx = {}</span><br><span class="line">jsonxx[<span class="string">"type"</span>]=<span class="string">"force"</span>;</span><br><span class="line">jsonxx[<span class="string">"categories"</span>]=categories</span><br><span class="line">jsonxx[<span class="string">"nodes"</span>] = json_nodes</span><br><span class="line">jsonxx[<span class="string">"links"</span>] = json_links</span><br><span class="line">ww.write(str(jsonxx))</span><br></pre></td></tr></table></figure>
<h3 id="数据可视化的时候的调整"><a href="#数据可视化的时候的调整" class="headerlink" title="数据可视化的时候的调整"></a>数据可视化的时候的调整</h3><ul>
<li>符号的调整<br>经过上面的处理,现在我们已经有一个json格式的数据文件了,但是j son里面是不会出现单引号的,这时候我们的数据格式是:</li>
</ul>
<figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'type'</span>: <span class="string">'force'</span>, <span class="string">'categories'</span>: [{<span class="string">'name'</span>: <span class="number">0</span>, <span class="string">'keyword'</span>: {}, <span class="string">'base'</span>: <span class="number">0</span>},</span><br></pre></td></tr></table></figure>
<p>这个样子在json里面会报错的。我们在用代码写入的时候,python的字典、链表等都需要转换为字符串的格式进行写入,在这个转化的过程中,python会将所有的双引号以及单引号都转化为单引号。因此,我们写入的时候,是单引号。<br>这里我们就不用代码在转译了,我们就直接使用webStorm中自带的工具,Edit->Find->Replace 进行单引号与双引号的替换即可。</p>
<ul>
<li>颜色的处理<br>使用模型自带的颜色是一共有9种颜色,在gexf文件中指定每个node的所属类别后,如果不为这些node自定义颜色的话,会在生成的画像中会为每一个类别默认设置一个颜色,每个类别的node拥有同一种颜色。<br>可以看到明显有一个问题就是当你的分类数量大于9时,颜色会再次重复回去,这样对于分类任务来说是没法接受的。<br>既然在生成关系图的设置中没有任何关于默认颜色的设置,那么这个颜色设定必然在自己所引用的echarts.min.js库中,所以只要耐心一点在echarts.min.js库中找到对应的部分,然后修改echarts.min.js库的源码这个问题就解决了。<br><strong><em>这个大约在16123行</em></strong><br>在网上找了一个颜色库,将默认的颜色库替换掉即可</li>
</ul>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">color: [</span><br><span class="line"> <span class="string">'#c23531'</span>, <span class="string">'#2f4554'</span>, <span class="string">'#61a0a8'</span>, <span class="string">'#d48265'</span>, <span class="string">'#91c7ae'</span>, <span class="string">'#749f83'</span>,</span><br><span class="line"> <span class="string">'#ca8622'</span>, <span class="string">'#bda29a'</span>, <span class="string">'#6e7074'</span>, <span class="string">'#546570'</span>, <span class="string">'#c4ccd3'</span>, <span class="string">'rgb(250, 235, 215, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(240, 248, 255, 1)'</span>, <span class="string">'rgb(0, 255, 255, 1)'</span>, <span class="string">'rgb(245, 245, 220, 1)'</span>, <span class="string">'rgb(255, 228, 196, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(127, 255, 212, 1)'</span>, <span class="string">'rgb(240, 255, 255, 1)'</span>, <span class="string">'rgb(0, 0, 0, 1)'</span>, <span class="string">'rgb(255, 235, 205, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(0, 0, 255, 1)'</span>, <span class="string">'rgb(138, 43, 226, 1)'</span>, <span class="string">'rgb(165, 42, 42, 1)'</span>, <span class="string">'rgb(222, 184, 135, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(95, 158, 160, 1)'</span>, <span class="string">'rgb(127, 255, 0, 1)'</span>, <span class="string">'rgb(210, 105, 30, 1)'</span>, <span class="string">'rgb(255, 127, 80, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(100, 149, 237, 1)'</span>, <span class="string">'rgb(255, 248, 220, 1)'</span>, <span class="string">'rgb(220, 20, 60, 1)'</span>, <span class="string">'rgb(0, 255, 255, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(0, 0, 139, 1)'</span>, <span class="string">'rgb(0, 139, 139, 1)'</span>, <span class="string">'rgb(184, 134, 11, 1)'</span>, <span class="string">'rgb(169, 169, 169, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(0, 100, 0, 1)'</span>, <span class="string">'rgb(169, 169, 169, 1)'</span>, <span class="string">'rgb(189, 183, 107, 1)'</span>, <span class="string">'rgb(139, 0, 139, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(85, 107, 47, 1)'</span>, <span class="string">'rgb(255, 140, 0, 1)'</span>, <span class="string">'rgb(153, 50, 204, 1)'</span>, <span class="string">'rgb(139, 0, 0, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(233, 150, 122, 1)'</span>, <span class="string">'rgb(143, 188, 143, 1)'</span>, <span class="string">'rgb(72, 61, 139, 1)'</span>, <span class="string">'rgb(47, 79, 79, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(47, 79, 79, 1)'</span>, <span class="string">'rgb(0, 206, 209, 1)'</span>, <span class="string">'rgb(148, 0, 211, 1)'</span>, <span class="string">'rgb(255, 20, 147, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(0, 191, 255, 1)'</span>, <span class="string">'rgb(105, 105, 105, 1)'</span>, <span class="string">'rgb(105, 105, 105, 1)'</span>, <span class="string">'rgb(30, 144, 255, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(178, 34, 34, 1)'</span>, <span class="string">'rgb(255, 250, 240, 1)'</span>, <span class="string">'rgb(34, 139, 34, 1)'</span>, <span class="string">'rgb(255, 0, 255, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(220, 220, 220, 1)'</span>, <span class="string">'rgb(248, 248, 255, 1)'</span>, <span class="string">'rgb(255, 215, 0, 1)'</span>, <span class="string">'rgb(218, 165, 32, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(128, 128, 128, 1)'</span>, <span class="string">'rgb(0, 128, 0, 1)'</span>, <span class="string">'rgb(173, 255, 47, 1)'</span>, <span class="string">'rgb(128, 128, 128, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(240, 255, 240, 1)'</span>, <span class="string">'rgb(255, 105, 180, 1)'</span>, <span class="string">'rgb(205, 92, 92, 1)'</span>, <span class="string">'rgb(75, 0, 130, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(255, 255, 240, 1)'</span>, <span class="string">'rgb(240, 230, 140, 1)'</span>, <span class="string">'rgb(230, 230, 250, 1)'</span>, <span class="string">'rgb(255, 240, 245, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(124, 252, 0, 1)'</span>, <span class="string">'rgb(255, 250, 205, 1)'</span>, <span class="string">'rgb(173, 216, 230, 1)'</span>, <span class="string">'rgb(240, 128, 128, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(224, 255, 255, 1)'</span>, <span class="string">'rgb(250, 250, 210, 1)'</span>, <span class="string">'rgb(211, 211, 211, 1)'</span>, <span class="string">'rgb(144, 238, 144, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(211, 211, 211, 1)'</span>, <span class="string">'rgb(255, 182, 193, 1)'</span>, <span class="string">'rgb(255, 160, 122, 1)'</span>, <span class="string">'rgb(32, 178, 170, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(135, 206, 250, 1)'</span>, <span class="string">'rgb(119, 136, 153, 1)'</span>, <span class="string">'rgb(119, 136, 153, 1)'</span>, <span class="string">'rgb(176, 196, 222, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(255, 255, 224, 1)'</span>, <span class="string">'rgb(0, 255, 0, 1)'</span>, <span class="string">'rgb(50, 205, 50, 1)'</span>, <span class="string">'rgb(250, 240, 230, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(255, 0, 255, 1)'</span>, <span class="string">'rgb(128, 0, 0, 1)'</span>, <span class="string">'rgb(102, 205, 170, 1)'</span>, <span class="string">'rgb(0, 0, 205, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(186, 85, 211, 1)'</span>, <span class="string">'rgb(147, 112, 219, 1)'</span>, <span class="string">'rgb(60, 179, 113, 1)'</span>, <span class="string">'rgb(123, 104, 238, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(0, 250, 154, 1)'</span>, <span class="string">'rgb(72, 209, 204, 1)'</span>, <span class="string">'rgb(199, 21, 133, 1)'</span>, <span class="string">'rgb(25, 25, 112, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(245, 255, 250, 1)'</span>, <span class="string">'rgb(255, 228, 225, 1)'</span>, <span class="string">'rgb(255, 228, 181, 1)'</span>, <span class="string">'rgb(255, 222, 173, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(0, 0, 128, 1)'</span>, <span class="string">'rgb(253, 245, 230, 1)'</span>, <span class="string">'rgb(128, 128, 0, 1)'</span>, <span class="string">'rgb(107, 142, 35, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(255, 165, 0, 1)'</span>, <span class="string">'rgb(255, 69, 0, 1)'</span>, <span class="string">'rgb(218, 112, 214, 1)'</span>, <span class="string">'rgb(238, 232, 170, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(152, 251, 152, 1)'</span>, <span class="string">'rgb(175, 238, 238, 1)'</span>, <span class="string">'rgb(219, 112, 147, 1)'</span>, <span class="string">'rgb(255, 239, 213, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(255, 218, 185, 1)'</span>, <span class="string">'rgb(205, 133, 63, 1)'</span>, <span class="string">'rgb(255, 192, 203, 1)'</span>, <span class="string">'rgb(221, 160, 221, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(176, 224, 230, 1)'</span>, <span class="string">'rgb(128, 0, 128, 1)'</span>, <span class="string">'rgb(255, 0, 0, 1)'</span>, <span class="string">'rgb(188, 143, 143, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(65, 105, 225, 1)'</span>, <span class="string">'rgb(139, 69, 19, 1)'</span>, <span class="string">'rgb(250, 128, 114, 1)'</span>, <span class="string">'rgb(244, 164, 96, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(46, 139, 87, 1)'</span>, <span class="string">'rgb(255, 245, 238, 1)'</span>, <span class="string">'rgb(160, 82, 45, 1)'</span>, <span class="string">'rgb(192, 192, 192, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(135, 206, 235, 1)'</span>, <span class="string">'rgb(106, 90, 205, 1)'</span>, <span class="string">'rgb(112, 128, 144, 1)'</span>, <span class="string">'rgb(112, 128, 144, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(255, 250, 250, 1)'</span>, <span class="string">'rgb(0, 255, 127, 1)'</span>, <span class="string">'rgb(70, 130, 180, 1)'</span>, <span class="string">'rgb(210, 180, 140, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(0, 128, 128, 1)'</span>, <span class="string">'rgb(216, 191, 216, 1)'</span>, <span class="string">'rgb(255, 99, 71, 1)'</span>, <span class="string">'rgb(64, 224, 208, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(238, 130, 238, 1)'</span>, <span class="string">'rgb(245, 222, 179, 1)'</span>, <span class="string">'rgb(255, 255, 255, 1)'</span>, <span class="string">'rgb(245, 245, 245, 1)'</span>,</span><br><span class="line"> <span class="string">'rgb(255, 255, 0, 1)'</span>, <span class="string">'rgb(154, 205, 50, 1)'</span></span><br><span class="line"> ],</span><br></pre></td></tr></table></figure>
<p>这样我们在去运行测试一下,就可以得到我们的社区分类的输出图形的可视化了<br><img src="https://img-blog.csdnimg.cn/20201206165351659.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"><br>这样处理过后,我们的社区的可视化现在就相对很好了一些。</p>
<h5 id="到此为止,对于社区检测的-关系图的输入,以及社区检测出来的社区的可视化分析我们就完成了,接下来我们需要做的是关系图的边的权重公式的优化,以及社区检测算法的优化。"><a href="#到此为止,对于社区检测的-关系图的输入,以及社区检测出来的社区的可视化分析我们就完成了,接下来我们需要做的是关系图的边的权重公式的优化,以及社区检测算法的优化。" class="headerlink" title="到此为止,对于社区检测的 关系图的输入,以及社区检测出来的社区的可视化分析我们就完成了,接下来我们需要做的是关系图的边的权重公式的优化,以及社区检测算法的优化。"></a>到此为止,对于社区检测的 关系图的输入,以及社区检测出来的社区的可视化分析我们就完成了,接下来我们需要做的是关系图的边的权重公式的优化,以及社区检测算法的优化。</h5><h3 id="测量社区分区算法分出来的社区的稳定性"><a href="#测量社区分区算法分出来的社区的稳定性" class="headerlink" title="测量社区分区算法分出来的社区的稳定性"></a>测量社区分区算法分出来的社区的稳定性</h3><p>现在我们一共有9天的数据(暂时还没有将更多的数据处理出来,因此我们就先用9天的数据分成3个3天进行测试社区的稳定性)</p>
<ul>
<li>社区的稳定性 定义为(同一批数据使用同一个社区划分算法,划分出来的社区 的个数相同,并且每一个社区的成员保持稳定)<br>|这里的函数为 FileRead 中的div3d,控制函数为getFen3(String path,String targe) |</li>
</ul>
<h3 id="社区检测算法Infomap"><a href="#社区检测算法Infomap" class="headerlink" title="社区检测算法Infomap"></a>社区检测算法Infomap</h3><p><a href="https://zhuanlan.zhihu.com/p/53085574" target="_blank" rel="noopener">算法简介</a><br>工具使用:在进行infomap工具安装的时候,网络上有很多的教程。</p>
<ul>
<li>第一种方式:因为我使用的是anaconda ,所以就先尝试了anaconda的安装方式<a href="https://anaconda.org/conda-forge/infomap" target="_blank" rel="noopener">安装连接</a>,这个方式安装的时候,我没有安装成功。</li>
<li>第二种方式:<a href="https://www.mapequation.org/infomap/" target="_blank" rel="noopener">在线运行</a>,这种方式在使用起来还是非常方便的,数据集可以直接在线上传,然后分区出来的结果可以在线可视化,缺点就是可修改性比较差</li>
<li>第三种方式:使用pip安装,这种方式我还没有尝试。<h4 id="简单来介绍一下在线infomap的使用"><a href="#简单来介绍一下在线infomap的使用" class="headerlink" title="简单来介绍一下在线infomap的使用"></a>简单来介绍一下在线infomap的使用</h4><img src="https://img-blog.csdnimg.cn/20201211161625849.png" alt="在这里插入图片描述"><br>点击进去,我们可以看到,这个界面,在使用的时候,只需要点击load network这个按钮将数据加载进去即可。<br>数据格式可以是加权图,也可以是无权图</li>
<li><p>带权图的格式<br>第一行的数据表示为66660 节点与31620节点 存在边,边的权重为15.0</p>
<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">66660</span> <span class="number">31602</span> <span class="number">15.0</span></span><br><span class="line"><span class="number">66660</span> <span class="number">66140</span> <span class="number">1.95</span></span><br><span class="line"><span class="number">66660</span> <span class="number">41621</span> <span class="number">10.14</span></span><br><span class="line"><span class="number">55555</span> <span class="number">29743</span> <span class="number">6.0</span></span><br><span class="line"><span class="number">55555</span> <span class="number">49980</span> <span class="number">6.0</span></span><br><span class="line"><span class="number">55555</span> <span class="number">48640</span> <span class="number">363.0</span></span><br><span class="line"><span class="number">55555</span> <span class="number">42866</span> <span class="number">9.92</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>无权图的格式<br>第一行的数据表示为66660 节点与31620节点 存在边</p>
<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">66660</span> <span class="number">31602</span></span><br><span class="line"><span class="number">66660</span> <span class="number">66140</span></span><br><span class="line"><span class="number">66660</span> <span class="number">41621</span></span><br><span class="line"><span class="number">55555</span> <span class="number">29743</span></span><br><span class="line"><span class="number">55555</span> <span class="number">49980</span></span><br><span class="line"><span class="number">55555</span> <span class="number">48640</span></span><br><span class="line"><span class="number">55555</span> <span class="number">42866</span></span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>接下来点击Run infomap这个按钮即可,下面显示框会出现运行报告</p>
<p>最左边的是open in networknavigator这个按钮,这个会在线显示分类的结果。<br>这个按钮下面有两个选项,可以选择clu 这个按钮,这个按钮是展示的最后最终的分类,还有一个按钮是Ftree这个按钮,这个会显示每一层的社区检测算法的结果。</p>
<p>最后的分类结果为<br><img src="https://img-blog.csdnimg.cn/20201211162449942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>我们还可以点击每一个大的社区,查看这个大的社区下面小的社区<br><img src="https://img-blog.csdnimg.cn/20201211162549584.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>infomap检测的社区是分层次的。</p>
<ul>
<li>Ftree 报告<br>目前为止,对于这个社区检测工具的使用已经完成。但是我们现在还不清楚检测结果的Ftree报告<br>这个报告主要分为两部分<ul>
<li>第一部分<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># path flow name node_id</span></span><br><span class="line"><span class="number">1</span>:<span class="number">1</span>:<span class="number">1</span> <span class="number">0.0235485</span> <span class="string">"51031"</span> <span class="number">51031</span></span><br><span class="line"><span class="number">1</span>:<span class="number">1</span>:<span class="number">2</span> <span class="number">0.0213197</span> <span class="string">"25310"</span> <span class="number">25310</span></span><br><span class="line"><span class="number">1</span>:<span class="number">1</span>:<span class="number">3</span> <span class="number">0.020168</span> <span class="string">"26306"</span> <span class="number">26306</span></span><br><span class="line"><span class="number">1</span>:<span class="number">1</span>:<span class="number">4</span> <span class="number">0.0192412</span> <span class="string">"25771"</span> <span class="number">25771</span></span><br></pre></td></tr></table></figure>
</li>
</ul>
</li>
</ul>
<p>第一行的意思是节点51031的节点id是51031,属于的社区层次为第一个社区中的第一号社区作为社区中的1号成员<br> <strong>现在flow的这个值,现在还没搞清楚</strong></p>
<ul>
<li>第二部分为<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">*Links undirected</span><br><span class="line">#*Links path enterFlow exitFlow numEdges numChildren</span><br><span class="line">*Links root 0 0 24 7</span><br><span class="line">1 2 5.27517e-06</span><br><span class="line">1 4 6.39821e-05</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>enterFlow和exitFLow的值现在还没搞清楚</p>
<h3 id="friendship-计算"><a href="#friendship-计算" class="headerlink" title="friendship 计算"></a>friendship 计算</h3><p>通过大量阅读论文,找到了一篇跟我们场景比较像的论文《An Enhanced Community-based Routing Assisted by Ferry in Opportunistic<br>Networks》,我们对我们的friendship 的计算公式进行了改进。用两条船最后一次相遇的时刻减去第一次相遇的时刻,作为船的总的相遇间隔,然后乘二作为分子。分母是将每一次相遇的间隔的平方和累加。<br>然后对我们的计算公式,以及统计函数进行了改进。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line">ship = open(<span class="string">"/Users/gorge/Desktop/newshipData/input/re50.txt"</span>)</span><br><span class="line">info = open(<span class="string">"/Users/gorge/Desktop/newshipData/r50port_ship.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line">xx = ship.readlines()</span><br><span class="line">T = <span class="number">12957</span></span><br><span class="line">res = []</span><br><span class="line">count = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> xx:</span><br><span class="line"> v = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(v)><span class="number">2</span>:</span><br><span class="line"> v = v[<span class="number">2</span>:]</span><br><span class="line"> SUM = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> v[<span class="number">0</span>]!=<span class="string">'12960'</span>:</span><br><span class="line"> <span class="comment">#print(v)</span></span><br><span class="line"> count+=<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">for</span> vi <span class="keyword">in</span> v:</span><br><span class="line"> SUM+=(((int(vi)**<span class="number">2</span>)/<span class="number">2</span>))</span><br><span class="line"> <span class="keyword">if</span> SUM ==<span class="number">0.0</span>:</span><br><span class="line"> SUM = T<span class="number">-3</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> sx =T/SUM</span><br><span class="line"> res.append(sx)</span><br><span class="line"> info.write(str(sx)+<span class="string">"\n"</span>)</span><br><span class="line">print(max(res))</span><br><span class="line">print(min(res))</span><br><span class="line">print(count)</span><br></pre></td></tr></table></figure>
<h4 id="绘制friendship的累积分布函数图"><a href="#绘制friendship的累积分布函数图" class="headerlink" title="绘制friendship的累积分布函数图"></a>绘制friendship的累积分布函数图</h4><p>其中,最重要的是hist函数,其中familddd表示的是一个一维数组,也就是我们那要统计的信息,可以通过参数cucumulative来调节,默认为False,画出的是PDF,那么True画出的便是CDF直方图。PDF(figure1)可以观察到整个数据在横轴范围内的分布,CDF(figure2)则可以看出不同的数据分布间的差异性,也可以观察到整个数据的增长趋势和波动情况。<br>观察两种数据分布的差异,可能使用直方图就不是很直观,各种直方柱会相互重叠,我们只需更改直方图的图像类型,令histtype=‘step’,就会画出一条曲线来。<br>港口对应的船舶数目的分布关系图的统计</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">ship = open(<span class="string">"/Users/gorge/Desktop/newshipData/input/re50.txt"</span>)</span><br><span class="line"></span><br><span class="line">xx = ship.readlines()</span><br><span class="line">count=<span class="number">0</span>;</span><br><span class="line">port_shipc = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> port_shipc[str(i+<span class="number">1</span>)] =<span class="number">0</span></span><br><span class="line">print(port_shipc)</span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> xx:</span><br><span class="line"> v = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(v)><span class="number">3</span> <span class="keyword">and</span> v[<span class="number">2</span>]!=<span class="string">'12960'</span>:</span><br><span class="line"> port_shipc[v[<span class="number">0</span>]] = (port_shipc[v[<span class="number">0</span>]]+<span class="number">1</span>)</span><br><span class="line">print(port_shipc)</span><br><span class="line">sd =<span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> sd=sd+port_shipc[str(i+<span class="number">1</span>)];</span><br><span class="line"> tt = open(<span class="string">"/Users/gorge/Desktop/newshipData/port_ship/"</span>+str(i+<span class="number">1</span>)+<span class="string">".txt"</span>,<span class="string">"a"</span>)</span><br><span class="line"> lii = <span class="string">"50 "</span>+str(port_shipc[str(i+<span class="number">1</span>)])+<span class="string">"\n"</span>;</span><br><span class="line"> tt.write(lii)</span><br><span class="line">print(sd)</span><br></pre></td></tr></table></figure>
<p>下面使用matalab绘制的上述统计的关系图<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">tic;</span><br><span class="line">clear all;</span><br><span class="line">data_dir = 'D:\MATLAB\port_ship\*.txt';</span><br><span class="line">namelist = dir(data_dir)</span><br><span class="line">len = length(namelist);</span><br><span class="line">for i =1:len</span><br><span class="line"> file_name{i} = namelist(i).name;</span><br><span class="line"> x = load(file_name{i});</span><br><span class="line"> H = plot(x(:,1),x(:,2));</span><br><span class="line"> hold on;</span><br><span class="line">end</span><br><span class="line">legend("1号港口","2号港口","3号港口","4号港口","5号港口","6号港口","7号港口","8号港口","9号港口","10号港口","11号港口","12号港口","13号港口","14号港口","15号港口","16号港口","17号港口","18号港口","19号港口","20号港口","21号港口","22号港口","23号港口","24号港口","25号港口","26号港口","27号港口","28号港口","29号港口","30号港口","31号港口","32号港口","33号港口","34号港口","35号港口","36号港口","37号港口","38号港口","39号港口","40号港口","41号港口","42号港口","43号港口","44号港口","45号港口","46号港口");</span><br><span class="line">LABEL_X = '通信半径/海里'; %X轴内容</span><br><span class="line">LABEL_Y = '船舶数量/条'; %Y轴内容</span><br><span class="line">%获取Y轴</span><br><span class="line">hY = ylabel(LABEL_Y,'FontSize',15); </span><br><span class="line">hX = xlabel(LABEL_X,'FontSize',15);%同上</span><br><span class="line">set(hY, 'FontSize',FONT_SIZE_LABEL);</span><br><span class="line">set(hY,'Fontname','Times New Roman');</span><br><span class="line">set(hY, 'Color', 'k');</span><br><span class="line">set(hY, 'Interpreter','latex');</span><br><span class="line">set(hX, 'FontSize', FONT_SIZE_LABEL); %坐标轴名称大小</span><br><span class="line">set(hX,'Fontname','Times New Roman'); %坐标轴字体</span><br><span class="line">set(hX, 'Color', 'k'); %坐标轴字体颜色</span><br><span class="line">set(hX, 'Interpreter','latex'); %坐标轴格式</span><br></pre></td></tr></table></figure></p>
<p><img src="https://img-blog.csdnimg.cn/20210108222659117.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"></p>
<p>friendship的CDF关系图<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">tic;</span><br><span class="line">clear all;</span><br><span class="line">x=load(<span class="string">'r50port_ship.txt'</span>)</span><br><span class="line">[h,stats] = cdfplot(x)</span><br><span class="line">title(<span class="string">'Friendship Between Ships and Ports'</span>)</span><br><span class="line">%xlim([<span class="number">0</span> <span class="number">0.0005</span>])</span><br><span class="line">legend(<span class="string">'R50 CDF'</span>,<span class="string">'Standard Normal CDF'</span>,<span class="string">'Location'</span>,<span class="string">'best'</span>)</span><br></pre></td></tr></table></figure></p>
<p><img src="https://img-blog.csdnimg.cn/20210108222742970.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"></p>
<h3 id="船舶之间关系的统计"><a href="#船舶之间关系的统计" class="headerlink" title="船舶之间关系的统计"></a>船舶之间关系的统计</h3><p>我们定义了一个船舶之间熟悉度的关系的公式,公式的含义是在一定的时间段下船舶相遇的平均等待时间,船舶的相遇定义为两个船之间的距离,小于一倍的通信半径。又在上面熟悉度的基础上进行了熟悉度的改进以及重新的统计计算。</p>
<h3 id="船舶与港口之间关系的统计"><a href="#船舶与港口之间关系的统计" class="headerlink" title="船舶与港口之间关系的统计"></a>船舶与港口之间关系的统计</h3><p>船舶与港口之间的关系是将港口看作是一条船,然后计算每条船与港口之间的熟悉度进行定义的。</p>
<h3 id="三个梯队船舶统计以及通信半径确定"><a href="#三个梯队船舶统计以及通信半径确定" class="headerlink" title="三个梯队船舶统计以及通信半径确定"></a>三个梯队船舶统计以及通信半径确定</h3><ul>
<li>确定第一梯队 第二梯队 第三梯队的比例依次为3 : 6 : 1</li>
<li>第一梯队的船舶的确定方式为将港口看作是一条船舶的轨迹,然后计算船舶与各个港口的熟悉度,根据船舶回港口的次数, 统计回港口的船的数量以及船舶的ID 主要使用的文件为re5 表示的就是船舶与港口的关系</li>
<li>第二梯队船舶的统计方式为计算出船舶与船舶之间的熟悉度关系,在所有的船号中,先将第一梯队的船号给记录下来,然后将第一梯队的每艘船统计相对应的相遇的船舶,然后在每一个第一梯队对应的相遇船舶中剔除掉,第一梯队的船舶。(如果不删除则要展现的是港口 - 对应第一梯队的船-对应第二梯队的船的相遇)<br> 具体的实现方法为:<br> 先使用python根据port_ship 的关系对应的文件是rex.txt ,统计出船与港口的关系,读取这一个文件,统计出第一梯队的船,保存到文件中,然后使用JAVA 语言读取第一梯队的文件,将船号保存到List中,并且使用Map使用第一梯队的船号作为Key ,Value设置为一个空的List ,进行初始化一个Map 集合,然后,读取船舶与船舶之间的关系的文件,rx_relation.txt 统计的船舶与船舶之间的关系,这个文件中包含三个信息,0 表示的是目标船A,1表示的目标船B,(1: ] 分别表示的是船A 与船B 等待下一次相遇的时间间隔。<br> 我们要按行遍历这个文件,首先要判断船A 与 船B 是不是全都属于第一梯队,这里使用and 判断,如果是船A 与船B中有一个是属于第一梯队 ,第二个不属于第一梯队,那么就找出不属于第一梯队的那个船,将该船号添加到Map的list中,这样就建立起了第一梯队的船与第二梯队的船的对应关系,这时候的第二梯队的船 是有重复船的。这样就可以将第二梯队与第一梯队的船建立起来了联系,写入到txt文件中。</li>
<li>第三梯队的船 就是祛除掉第一梯队的船 与 第二梯队的船 剩下的船<h4 id="统计第一梯队的船舶的船舶id以及相应通信半径下的船舶的数量"><a href="#统计第一梯队的船舶的船舶id以及相应通信半径下的船舶的数量" class="headerlink" title="统计第一梯队的船舶的船舶id以及相应通信半径下的船舶的数量"></a>统计第一梯队的船舶的船舶id以及相应通信半径下的船舶的数量</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">ship = open(<span class="string">"/Users/gorge/Desktop/newshipData/input/re50.txt"</span>)</span><br><span class="line">thepsn = open(<span class="string">"/Users/gorge/Desktop/firstGroupShip/thepostship50number.txt"</span>, <span class="string">"a"</span>)</span><br><span class="line">thePs = open(<span class="string">"/Users/gorge/Desktop/firstGroupShip/thepostship50.txt"</span>, <span class="string">"a"</span>)</span><br><span class="line">ships = open(<span class="string">"/Users/gorge/Desktop/firstGroupShip/ships50.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line">xx = ship.readlines()</span><br><span class="line">count = <span class="number">0</span>;</span><br><span class="line">port_shipc = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> port_shipc[str(i + <span class="number">1</span>)] = <span class="number">0</span></span><br><span class="line">ship_portc = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> ship_portc[str(i + <span class="number">1</span>)] = []</span><br><span class="line">shipc = {}</span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> xx:</span><br><span class="line"> v = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(v) > <span class="number">3</span> <span class="keyword">and</span> v[<span class="number">2</span>] != <span class="string">'12960'</span>:</span><br><span class="line"> port_shipc[v[<span class="number">0</span>]] = (port_shipc[v[<span class="number">0</span>]] + <span class="number">1</span>)</span><br><span class="line"> ship_portc[v[<span class="number">0</span>]].append(str(v[<span class="number">1</span>]).split(<span class="string">"."</span>)[<span class="number">0</span>])</span><br><span class="line"> shipc[v[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]] = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> key, value <span class="keyword">in</span> port_shipc.items():</span><br><span class="line"> l = str(key) + <span class="string">" "</span> + str(value) + <span class="string">"\n"</span>;</span><br><span class="line"> print(l)</span><br><span class="line"> thepsn.write(l)</span><br><span class="line"><span class="keyword">for</span> key1, value1 <span class="keyword">in</span> ship_portc.items():</span><br><span class="line"> l1 = str(key1)</span><br><span class="line"> <span class="keyword">for</span> vx <span class="keyword">in</span> value1:</span><br><span class="line"> l1 = l1 + <span class="string">" "</span> + vx;</span><br><span class="line"> l1 = l1 + <span class="string">"\n"</span>;</span><br><span class="line"> print(l1)</span><br><span class="line"> thePs.write(l1)</span><br><span class="line"><span class="keyword">for</span> key,vlaue <span class="keyword">in</span> shipc.items():</span><br><span class="line"> ships.write(str(key)+<span class="string">"\n"</span>)</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h4 id="数据可视化-Echarts-树状图json数据格式生成"><a href="#数据可视化-Echarts-树状图json数据格式生成" class="headerlink" title="数据可视化 Echarts 树状图json数据格式生成"></a>数据可视化 Echarts 树状图json数据格式生成</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">ship = open(<span class="string">"/Users/gorge/Desktop/newshipData/input/re50.txt"</span>)</span><br><span class="line">Treejson = open(<span class="string">"/Users/gorge/Desktop/range50.json"</span>,<span class="string">"a"</span>)</span><br><span class="line">xx = ship.readlines()</span><br><span class="line">count = <span class="number">0</span>;</span><br><span class="line">port_shipc = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> port_shipc[str(i + <span class="number">1</span>)] = <span class="number">0</span></span><br><span class="line">ship_portc = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> ship_portc[str(i + <span class="number">1</span>)] = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> xx:</span><br><span class="line"> v = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(v) > <span class="number">3</span> <span class="keyword">and</span> v[<span class="number">2</span>] != <span class="string">'12960'</span>:</span><br><span class="line"> port_shipc[v[<span class="number">0</span>]] = (port_shipc[v[<span class="number">0</span>]] + <span class="number">1</span>)</span><br><span class="line"> ship_portc[v[<span class="number">0</span>]].append(str(v[<span class="number">1</span>]).split(<span class="string">"."</span>)[<span class="number">0</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 主要使用的是根据ship_portc进行拼接</span></span><br><span class="line"><span class="comment"># 首先创建一个父类 map</span></span><br><span class="line">father = {}</span><br><span class="line">father[<span class="string">"children"</span>] = []</span><br><span class="line">father[<span class="string">"name"</span>] = <span class="string">"港口"</span></span><br><span class="line"><span class="comment"># 先将港口的名字拼接进去</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> oil = {}</span><br><span class="line"> oil[<span class="string">"children"</span>] = []</span><br><span class="line"> oil[<span class="string">"name"</span>] = <span class="string">"港口"</span>+str(i+<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">for</span> sx <span class="keyword">in</span> ship_portc[str(i + <span class="number">1</span>)]:</span><br><span class="line"> oil2 = {}</span><br><span class="line"> oil2[<span class="string">"children"</span>] = []</span><br><span class="line"> oil2[<span class="string">"name"</span>] = str(sx);</span><br><span class="line"> oil[<span class="string">"children"</span>].append(oil2)</span><br><span class="line"> father[<span class="string">"children"</span>].append(oil)</span><br><span class="line">Treejson.write(str(father))</span><br></pre></td></tr></table></figure>
<p>最后我们就得到了第一梯队与港口的关系,分别为5,10,20,50海里的关系。<br><img src="https://img-blog.csdnimg.cn/20210107211244201.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"></p>
<h4 id="统计第一梯队的船对应相遇的第二梯队的船"><a href="#统计第一梯队的船对应相遇的第二梯队的船" class="headerlink" title="统计第一梯队的船对应相遇的第二梯队的船"></a>统计第一梯队的船对应相遇的第二梯队的船</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> getTwoGroupShip("C:/Users/ouc/Desktop/firstGroupShip/ships5.txt","C:/Users/ouc/Desktop/result/r5_relation.txt","C:/Users/ouc/Desktop/twoGroupShip/one_twoGroupShips5.txt");</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> fistGroupPath 船舶与港口关系的文件 rex.txt</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> shiprePath 船舶与船舶之间关系的文件路径 rx_relation.txt</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> twog 第二梯队的船的保存路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">getTwoGroupShip</span><span class="params">(String fistGroupPath,String shiprePath,String twoGrouppath)</span> </span>{</span><br><span class="line"> <span class="comment">//首先是读取第一梯队的船 船号最为key list作为value</span></span><br><span class="line"> FileRead tool = <span class="keyword">new</span> FileRead();</span><br><span class="line"> getTenMin wtool = <span class="keyword">new</span> getTenMin();</span><br><span class="line"> List<String> theFirstGroup = tool.readFileLine(fistGroupPath);</span><br><span class="line"> <span class="comment">//创建一个第一梯队对应的船的组</span></span><br><span class="line"> Map<String, List<String>> fistmap = <span class="keyword">new</span> HashMap<String, List<String>>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < theFirstGroup.size(); i++) {</span><br><span class="line"> fistmap.put(theFirstGroup.get(i),<span class="keyword">new</span> LinkedList<String>());</span><br><span class="line"> }</span><br><span class="line"> List<List<String>> shiprela = tool.readFILE3(shiprePath);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i =<span class="number">0</span>;i<shiprela.size();i++) {</span><br><span class="line"> List<String> line = shiprela.get(i);</span><br><span class="line"> <span class="keyword">if</span>(Integer.parseInt(line.get(<span class="number">2</span>))><span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">if</span>(!line.get(<span class="number">2</span>).equals(<span class="string">"12960"</span>)) {</span><br><span class="line"> String x1 = line.get(<span class="number">0</span>).split(<span class="string">"\\."</span>)[<span class="number">0</span>];</span><br><span class="line"> String x2 = line.get(<span class="number">1</span>).split(<span class="string">"\\."</span>)[<span class="number">0</span>];</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//判断船A 与船B是不是都属于第一梯队</span></span><br><span class="line"> <span class="keyword">if</span>(theFirstGroup.contains(x1)&&!theFirstGroup.contains(x2)) {</span><br><span class="line"> fistmap.get(x1).add(x2);</span><br><span class="line"> System.out.println(x1+<span class="string">" "</span>+x2);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(!theFirstGroup.contains(x1)&&theFirstGroup.contains(x2)) {</span><br><span class="line"> fistmap.get(x2).add(x1);</span><br><span class="line"> System.out.println(x1+<span class="string">" "</span>+x2);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> String value = wtool.WriteValue3(fistmap);</span><br><span class="line"> wtool.writerFile(twoGrouppath, value);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="统计第二梯队的船的数量以及ID"><a href="#统计第二梯队的船的数量以及ID" class="headerlink" title="统计第二梯队的船的数量以及ID"></a>统计第二梯队的船的数量以及ID</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#统计第二梯队的船数目(重复的算一次)</span></span><br><span class="line">ship = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/one_twoGroupShips20.txt"</span>)</span><br><span class="line">ship_id = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/Twoships20.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line">page = ship.readlines();</span><br><span class="line">ff = {}</span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> page:</span><br><span class="line"> <span class="keyword">if</span> len(x)><span class="number">0</span>:</span><br><span class="line"> xx = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)[<span class="number">1</span>:]</span><br><span class="line"> <span class="keyword">for</span> v <span class="keyword">in</span> xx:</span><br><span class="line"> ff[v]=<span class="number">0</span></span><br><span class="line">print(len(ff))</span><br><span class="line"><span class="keyword">for</span> k <span class="keyword">in</span> ff.keys():</span><br><span class="line"> ship_id.write(str(k)+<span class="string">"\n"</span>)</span><br></pre></td></tr></table></figure>
<h4 id="统计第一梯队的船对应的第二梯队船的数目"><a href="#统计第一梯队的船对应的第二梯队船的数目" class="headerlink" title="统计第一梯队的船对应的第二梯队船的数目"></a>统计第一梯队的船对应的第二梯队船的数目</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">ship = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/one_twoGroupShips20.txt"</span>)</span><br><span class="line">ship_write = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/one_twoShips20number.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line">page = ship.readlines();</span><br><span class="line">ff = {}</span><br><span class="line"><span class="keyword">for</span> x in page:</span><br><span class="line"> <span class="function"><span class="keyword">if</span> <span class="title">len</span><span class="params">(x)</span>>0:</span></span><br><span class="line"><span class="function"> cx </span>= x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)[<span class="number">0</span>]</span><br><span class="line"> xx = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)[<span class="number">1</span>:]</span><br><span class="line"> <span class="keyword">for</span> v in xx:</span><br><span class="line"> ff[cx]=len(xx)</span><br><span class="line"><span class="keyword">for</span> key,value in ff.items():</span><br><span class="line"> s = str(key)+<span class="string">" "</span>+str(value)+<span class="string">"\n"</span></span><br><span class="line"> ship_write.write(s)</span><br><span class="line">print(ff)</span><br></pre></td></tr></table></figure>
<h5 id="统计船舶与港口相遇次数-、每次相遇花费时间、以及完成相遇需要使用的时间的代码"><a href="#统计船舶与港口相遇次数-、每次相遇花费时间、以及完成相遇需要使用的时间的代码" class="headerlink" title="统计船舶与港口相遇次数 、每次相遇花费时间、以及完成相遇需要使用的时间的代码"></a>统计船舶与港口相遇次数 、每次相遇花费时间、以及完成相遇需要使用的时间的代码</h5><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//读取港口的文件,计算船与港口的伴随关系 </span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title">getMeetportWith</span><span class="params">(List<String> firstline ,List<List<String>> second)</span> </span>{</span><br><span class="line"> <span class="comment">//定义一个存储上一个时刻的变量</span></span><br><span class="line"> <span class="keyword">double</span> pretime = <span class="number">0.0</span>;</span><br><span class="line"> <span class="comment">//定义一个变量用来 存储船的相遇次数</span></span><br><span class="line"> <span class="keyword">int</span> count = <span class="number">0</span>;</span><br><span class="line"> String secshipid = second.get(<span class="number">0</span>).get(<span class="number">1</span>);</span><br><span class="line"> String firshipid = firstline.get(<span class="number">0</span>);</span><br><span class="line"> System.out.println(<span class="string">"港口"</span>+firshipid+<span class="string">"相遇"</span>+secshipid+<span class="string">"getMeetCount() start"</span>);</span><br><span class="line"> List<String> lStrings = <span class="keyword">new</span> LinkedList<String>();</span><br><span class="line"> lStrings.add(firshipid);</span><br><span class="line"> lStrings.add(secshipid);</span><br><span class="line"> <span class="comment">//初始化一个用来记录两条船时间间隔的链表</span></span><br><span class="line"> List<String> banshui = <span class="keyword">new</span> LinkedList<String>();</span><br><span class="line"> <span class="comment">//定义一个变量用来存储在船相遇的时候,伴随了几个间隔</span></span><br><span class="line"> <span class="keyword">int</span> b = <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//定义一个旗帜来表示这段间隔是不是船开始伴随了</span></span><br><span class="line"> <span class="keyword">boolean</span> flag = <span class="keyword">false</span>;</span><br><span class="line"> <span class="comment">//定一个变量来判断表示两个船是不是第一次相遇</span></span><br><span class="line"> <span class="keyword">boolean</span> firstmeetTime = <span class="keyword">true</span>;</span><br><span class="line"> <span class="comment">//定义一个变量来存储第一次相遇的时刻</span></span><br><span class="line"> <span class="keyword">double</span> firtimeet = <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//定义一个变量用来保存 最后一次相遇的时刻</span></span><br><span class="line"> <span class="keyword">double</span> endtimeet = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">if</span>(second.size()>=<span class="number">4</span>) {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<second.size()-<span class="number">1</span>;i++) {</span><br><span class="line"> <span class="comment">//获得第二条船的第i时刻的记录</span></span><br><span class="line"> List<String> secondline = second.get(i);</span><br><span class="line"> <span class="comment">//记录一下当前时刻 </span></span><br><span class="line"> <span class="keyword">double</span> curtime = Double.parseDouble(secondline.get(<span class="number">0</span>));</span><br><span class="line"> <span class="comment">//获得第一条船的第i时刻的 x y </span></span><br><span class="line"> <span class="keyword">double</span> firstx = Double.parseDouble(firstline.get(<span class="number">0</span>));</span><br><span class="line"> <span class="keyword">double</span> firsty = Double.parseDouble(firstline.get(<span class="number">1</span>));</span><br><span class="line"> <span class="comment">//获得第二条船的第i时刻的x y</span></span><br><span class="line"> <span class="keyword">double</span> secondx = Double.parseDouble(secondline.get(<span class="number">2</span>));</span><br><span class="line"> <span class="keyword">double</span> secondy = Double.parseDouble(secondline.get(<span class="number">3</span>));</span><br><span class="line"> <span class="comment">//计算一下 两个点之间的距离 与 船舶的二倍的通信呢半径比较一下</span></span><br><span class="line"> <span class="keyword">double</span> x = Math.pow((secondx-firstx), <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">double</span> y = Math.pow((secondy-firsty), <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">double</span> distance = Math.sqrt(x+y);</span><br><span class="line"> <span class="comment">//设置一下船的通信范围</span></span><br><span class="line"> <span class="keyword">double</span> contactRange = <span class="number">5</span>*<span class="number">1.87</span>;</span><br><span class="line"> <span class="keyword">if</span>(distance<=contactRange) {</span><br><span class="line"> <span class="keyword">if</span>(firstmeetTime) {</span><br><span class="line"> firtimeet = curtime;</span><br><span class="line"> firstmeetTime = <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> endtimeet = curtime+<span class="number">3</span>;</span><br><span class="line"> <span class="keyword">if</span>(curtime-pretime><span class="number">3</span>) {</span><br><span class="line"> pretime = curtime;</span><br><span class="line"> count++;</span><br><span class="line"> flag= <span class="keyword">true</span>;</span><br><span class="line"> b++;</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> pretime = curtime;</span><br><span class="line"> flag = <span class="keyword">true</span>;</span><br><span class="line"> b++;</span><br><span class="line"> <span class="comment">//System.out.println("b"+b);</span></span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> flag=<span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(!flag && b!=<span class="number">0</span>) {</span><br><span class="line"> <span class="comment">// System.out.println(flag);</span></span><br><span class="line"> banshui.add(String.valueOf(b*<span class="number">3</span>));</span><br><span class="line"> b=<span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(b!=<span class="number">0</span>) {</span><br><span class="line"> <span class="comment">//System.out.println("out"+b);</span></span><br><span class="line"> banshui.add(String.valueOf(b*<span class="number">3</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//伴随的次数</span></span><br><span class="line"> lStrings.add(String.valueOf(count));</span><br><span class="line"> <span class="comment">//每次伴随的时间</span></span><br><span class="line"> lStrings.add(String.valueOf(banshui));</span><br><span class="line"> <span class="comment">//完成伴随需要花费的总的时间</span></span><br><span class="line"> lStrings.add(String.valueOf(endtimeet-firtimeet));</span><br><span class="line"> System.out.println(<span class="string">"船"</span>+firshipid+<span class="string">"相遇"</span>+secshipid+<span class="string">"次数为:"</span>+count);</span><br><span class="line"> System.out.println(<span class="string">"getMeetCount() end"</span>);</span><br><span class="line"> <span class="keyword">return</span> lStrings;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="统计船舶与港口相遇次数以及熟悉度相互对应的代码"><a href="#统计船舶与港口相遇次数以及熟悉度相互对应的代码" class="headerlink" title="统计船舶与港口相遇次数以及熟悉度相互对应的代码"></a>统计船舶与港口相遇次数以及熟悉度相互对应的代码</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line">ship = open(<span class="string">"C:/Users/ouc/Desktop/result/re100.txt"</span>)</span><br><span class="line">ship_number= open(<span class="string">"C:/Users/ouc/Desktop/result/re100meet.txt"</span>);</span><br><span class="line">info = open(<span class="string">"C:/Users/ouc/Desktop/result/number_100rean.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line">xx = ship.readlines()</span><br><span class="line">yy = ship_number.readlines()</span><br><span class="line">T = <span class="number">12957</span></span><br><span class="line"></span><br><span class="line">count = <span class="number">0</span>;</span><br><span class="line">N_R = {}</span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> xx:</span><br><span class="line"> v = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(v)><span class="number">2</span>:</span><br><span class="line"> POR = v[<span class="number">0</span>]</span><br><span class="line"> shipId = v[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line"> id = str(POR)+<span class="string">"_"</span>+str(shipId)</span><br><span class="line"> v = v[<span class="number">2</span>:]</span><br><span class="line"> SUM = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> v[<span class="number">0</span>]!=<span class="string">'12960'</span>:</span><br><span class="line"> N_R[id] = []</span><br><span class="line"> <span class="comment">#print(v)</span></span><br><span class="line"> count+=<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">for</span> vi <span class="keyword">in</span> v:</span><br><span class="line"> SUM+=(((int(vi)**<span class="number">2</span>)/<span class="number">2</span>))</span><br><span class="line"> <span class="keyword">if</span> SUM ==<span class="number">0.0</span>:</span><br><span class="line"> SUM = T<span class="number">-3</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> sx =T/SUM</span><br><span class="line"> N_R[id].append(sx)</span><br><span class="line"> <span class="comment">#info.write(str(sx)+"\n")</span></span><br><span class="line"><span class="keyword">for</span> y <span class="keyword">in</span> yy:</span><br><span class="line"> vx = y.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> int(vx[<span class="number">2</span>])><span class="number">0</span>:</span><br><span class="line"> POR = vx[<span class="number">0</span>]</span><br><span class="line"> shipId = vx[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line"> id = str(POR) + <span class="string">"_"</span> + str(shipId)</span><br><span class="line"> n = vx[<span class="number">2</span>]</span><br><span class="line"> <span class="keyword">if</span> id <span class="keyword">in</span> N_R.keys():</span><br><span class="line"> N_R[id].append(n)</span><br><span class="line"><span class="keyword">for</span> key,value <span class="keyword">in</span> N_R.items():</span><br><span class="line"> xc = key</span><br><span class="line"> <span class="keyword">if</span> len(value)==<span class="number">2</span>:</span><br><span class="line"> v1 = value[<span class="number">0</span>]</span><br><span class="line"> v2 =value[<span class="number">1</span>]</span><br><span class="line"> xc=xc+<span class="string">" "</span>+str(v1)+<span class="string">" "</span>+str(v2)+<span class="string">"\n"</span></span><br><span class="line"> info.write(str(xc))</span><br><span class="line">print(len(N_R))</span><br></pre></td></tr></table></figure>
<h4 id="分港口统计第一梯队的船对应的第二梯队的船舶的ID"><a href="#分港口统计第一梯队的船对应的第二梯队的船舶的ID" class="headerlink" title="分港口统计第一梯队的船对应的第二梯队的船舶的ID"></a>分港口统计第一梯队的船对应的第二梯队的船舶的ID</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">one_two = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/one_twoGroupShips100.txt"</span>)</span><br><span class="line">postship = open(<span class="string">"C:/Users/ouc/Desktop/firstGroupShip/thepostship100.txt"</span>)</span><br><span class="line">page = one_two.readlines();</span><br><span class="line">page2 = postship.readlines()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 首先将第一港口的船号 与 第二港口的船号 存储到一map里面</span></span><br><span class="line">oe_map = {}</span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> page:</span><br><span class="line"> sx = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(sx) ><span class="number">2</span>:</span><br><span class="line"> oe_map[sx[<span class="number">0</span>]] = sx[<span class="number">1</span>:]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> oe_map[sx[<span class="number">0</span>]] = []</span><br><span class="line"><span class="comment"># 读取港口与第一梯队的船对应关系</span></span><br><span class="line"><span class="keyword">for</span> y <span class="keyword">in</span> page2:</span><br><span class="line"> sy = y.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> port = sy[<span class="number">0</span>]</span><br><span class="line"> oe_ship = sy[<span class="number">1</span>:]</span><br><span class="line"> tt = open(<span class="string">"C:/Users/ouc/Desktop/one_two_100ship/"</span>+str(port)+<span class="string">".txt"</span>,<span class="string">"a"</span>)</span><br><span class="line"> <span class="keyword">for</span> oo_s <span class="keyword">in</span> oe_ship:</span><br><span class="line"> <span class="keyword">if</span> oo_s <span class="keyword">in</span> oe_map.keys():</span><br><span class="line"> ss = str(oo_s)+<span class="string">" "</span></span><br><span class="line"> <span class="keyword">for</span> ui <span class="keyword">in</span> oe_map[oo_s]:</span><br><span class="line"> ss= ss+<span class="string">" "</span>+str(ui)</span><br><span class="line"> ss=ss+<span class="string">"\n"</span></span><br><span class="line"> tt.write(ss)</span><br></pre></td></tr></table></figure>
<h4 id="港口与第一梯队的船以及第二梯队的船的对应关系"><a href="#港口与第一梯队的船以及第二梯队的船的对应关系" class="headerlink" title="港口与第一梯队的船以及第二梯队的船的对应关系"></a>港口与第一梯队的船以及第二梯队的船的对应关系</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line">ship = open(<span class="string">"/Volumes/17854111053/期末复习/result/re50.txt"</span>)</span><br><span class="line">Treejson = open(<span class="string">"/Users/gorge/Desktop/range50.json"</span>,<span class="string">"a"</span>)</span><br><span class="line">one_twoID = open(<span class="string">"/Volumes/17854111053/期末复习/twoGroupShip/one_twoGroupShips50.txt"</span>)</span><br><span class="line">xx = ship.readlines()</span><br><span class="line">count = <span class="number">0</span>;</span><br><span class="line">port_shipc = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> port_shipc[str(i + <span class="number">1</span>)] = <span class="number">0</span></span><br><span class="line">ship_portc = {}</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> ship_portc[str(i + <span class="number">1</span>)] = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> xx:</span><br><span class="line"> v = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(v) > <span class="number">3</span> <span class="keyword">and</span> v[<span class="number">2</span>] != <span class="string">'12960'</span>:</span><br><span class="line"> port_shipc[v[<span class="number">0</span>]] = (port_shipc[v[<span class="number">0</span>]] + <span class="number">1</span>)</span><br><span class="line"> ship_portc[v[<span class="number">0</span>]].append(str(v[<span class="number">1</span>]).split(<span class="string">"."</span>)[<span class="number">0</span>])</span><br><span class="line"><span class="comment">#创建一个第一梯队的船号对应的第二梯队的船的船号</span></span><br><span class="line">yy = one_twoID.readlines()</span><br><span class="line">one_twoDir = {}</span><br><span class="line"><span class="keyword">for</span> iy <span class="keyword">in</span> yy:</span><br><span class="line"> iyy = iy.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> one_twoDir[iyy[<span class="number">0</span>]]=[]</span><br><span class="line"> <span class="keyword">if</span> len(iyy)><span class="number">1</span>:</span><br><span class="line"> iyy2 = iyy[<span class="number">1</span>:]</span><br><span class="line"> <span class="keyword">for</span> sd <span class="keyword">in</span> iyy2:</span><br><span class="line"> one_twoDir[str(iyy[<span class="number">0</span>])].append(str(sd))</span><br><span class="line"><span class="comment"># 主要使用的是根据ship_portc进行拼接</span></span><br><span class="line"><span class="comment"># 首先创建一个父类 map</span></span><br><span class="line">father = {}</span><br><span class="line">father[<span class="string">"children"</span>] = []</span><br><span class="line">father[<span class="string">"name"</span>] = <span class="string">"港口"</span></span><br><span class="line"><span class="comment"># 先将港口的名字拼接进去</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">47</span>):</span><br><span class="line"> oil = {}</span><br><span class="line"> oil[<span class="string">"children"</span>] = []</span><br><span class="line"> oil[<span class="string">"name"</span>] = <span class="string">"港口"</span>+str(i+<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">for</span> sx <span class="keyword">in</span> ship_portc[str(i + <span class="number">1</span>)]:</span><br><span class="line"> oil2 = {}</span><br><span class="line"> oil2[<span class="string">"children"</span>] = []</span><br><span class="line"> <span class="keyword">for</span> sds <span class="keyword">in</span> one_twoDir[str(sx)]:</span><br><span class="line"> oil3 = {}</span><br><span class="line"> oil3[<span class="string">"children"</span>] = []</span><br><span class="line"> oil3[<span class="string">"name"</span>]=str(sds)</span><br><span class="line"> oil2[<span class="string">"children"</span>].append(oil3)</span><br><span class="line"> oil2[<span class="string">"name"</span>] = str(sx);</span><br><span class="line"> oil[<span class="string">"children"</span>].append(oil2)</span><br><span class="line"> father[<span class="string">"children"</span>].append(oil)</span><br><span class="line"><span class="comment">#print(father)</span></span><br><span class="line">Treejson.write(str(father))</span><br></pre></td></tr></table></figure>
<h4 id="分港口统计第二梯队的船的数量"><a href="#分港口统计第二梯队的船的数量" class="headerlink" title="分港口统计第二梯队的船的数量"></a>分港口统计第二梯队的船的数量</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">nd = {}</span><br><span class="line">dfs = open(<span class="string">"C:/Users/ouc/Desktop/twonumber100.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">1</span>,<span class="number">48</span>):</span><br><span class="line"> ss = open(<span class="string">"C:/Users/ouc/Desktop/one_two_100ship/one_two_100ship/"</span>+str(i)+<span class="string">".txt"</span>)</span><br><span class="line"> page = ss.readlines()</span><br><span class="line"> nd[i]=<span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> page:</span><br><span class="line"> ll = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> len(ll)><span class="number">1</span>:</span><br><span class="line"> llx = ll[<span class="number">1</span>:]</span><br><span class="line"> nd[i]=len(llx)</span><br><span class="line"> dfs.write(str(i)+<span class="string">" "</span>+str(nd[i])+<span class="string">"\n"</span>)</span><br><span class="line">print(nd)</span><br></pre></td></tr></table></figure>
<h4 id="聚类算法"><a href="#聚类算法" class="headerlink" title="聚类算法"></a>聚类算法</h4><p>一维数据进行聚类,使用设置阈值间隔的方式</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> pandas <span class="keyword">import</span> Series</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">threshold_cluster</span><span class="params">(Data_set,threshold)</span>:</span></span><br><span class="line"> <span class="comment">#统一格式化数据为一维数组</span></span><br><span class="line"> stand_array=np.asarray(Data_set).ravel(<span class="string">'C'</span>)</span><br><span class="line"> <span class="comment"># print(stand_array)</span></span><br><span class="line"> <span class="comment">#为一维数组赋值上索引</span></span><br><span class="line"> stand_Data=Series(stand_array).sort_values()</span><br><span class="line"> <span class="comment">#print(stand_Data)</span></span><br><span class="line"> <span class="comment"># 创建索引数组 创建分类结果的数组</span></span><br><span class="line"> index_list,class_k=[],[]</span><br><span class="line"> <span class="comment"># 判断函数是不是还有数据,如果有数据的话就可以继续便利了</span></span><br><span class="line"> <span class="keyword">while</span> stand_Data.any():</span><br><span class="line"> <span class="comment"># 如果只有一个数据的话 就直接将数据拼接到 index_list 以及 class_k中</span></span><br><span class="line"> <span class="keyword">if</span> len(stand_Data)==<span class="number">1</span>:</span><br><span class="line"> index_list.append(list(stand_Data.index))</span><br><span class="line"> class_k.append(list(stand_Data))</span><br><span class="line"> <span class="comment"># 将数据stand_Data进行清空</span></span><br><span class="line"> stand_Data=stand_Data.drop(stand_Data.index)</span><br><span class="line"> <span class="comment"># 如果多与两个数据的话 就执行下面的代码</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="comment"># 先将第一个数据的index 放置到 第一个分类中</span></span><br><span class="line"> class_data_index=stand_Data.index[<span class="number">0</span>]</span><br><span class="line"> <span class="comment">#print(class_data_index,"---")</span></span><br><span class="line"> <span class="comment"># 将第一个的数据 放置到第一个分类中</span></span><br><span class="line"> class_data=stand_Data[class_data_index]</span><br><span class="line"> <span class="comment"># 将已经分类的数据删除掉</span></span><br><span class="line"> stand_Data=stand_Data.drop(class_data_index)</span><br><span class="line"> <span class="comment"># 判断已经分类的数据与剩下没有分类数据的差值 然后将差值 转化为一维数组</span></span><br><span class="line"> <span class="keyword">if</span> (abs(stand_Data-class_data)<=threshold).any():</span><br><span class="line"> args_data=stand_Data[abs(stand_Data-class_data)<=threshold]</span><br><span class="line"> stand_Data=stand_Data.drop(args_data.index)</span><br><span class="line"> index_list.append([class_data_index]+list(args_data.index))</span><br><span class="line"> class_k.append([class_data]+list(args_data))</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> index_list.append([class_data_index])</span><br><span class="line"> class_k.append([class_data])</span><br><span class="line"> <span class="keyword">return</span> index_list,class_k</span><br><span class="line">file = open(<span class="string">"/Users/gorge/Desktop/thepostship100number.txt"</span>)</span><br><span class="line">Data_set = []</span><br><span class="line">page = file.readlines()</span><br><span class="line"><span class="keyword">for</span> sc <span class="keyword">in</span> page:</span><br><span class="line"> df= sc.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> k = df[<span class="number">0</span>]</span><br><span class="line"> v = df[<span class="number">1</span>]</span><br><span class="line"> Data_set.append(int(v))</span><br><span class="line">index_list, class_k = threshold_cluster(Data_set, <span class="number">5</span>)</span><br><span class="line">print(index_list)</span><br><span class="line">print(class_k)</span><br></pre></td></tr></table></figure>
<h5 id="第二梯队的船相遇了多少第一梯队的船,与第一梯队的船相遇了多少次-熟悉度是怎么样的"><a href="#第二梯队的船相遇了多少第一梯队的船,与第一梯队的船相遇了多少次-熟悉度是怎么样的" class="headerlink" title="第二梯队的船相遇了多少第一梯队的船,与第一梯队的船相遇了多少次 熟悉度是怎么样的"></a>第二梯队的船相遇了多少第一梯队的船,与第一梯队的船相遇了多少次 熟悉度是怎么样的</h5><ul>
<li><p>第二梯队的船相遇第二梯队的船多少次</p>
<ul>
<li>首先是祛除重复的统计出第二梯队的船,放在 Twoships.txt文件中,然后读取第一梯队与第二梯队对应关系的one_twoGroupShipsx.txt的文件,如果该文件第二列以后的ID包含现在关注的第二梯队的船的ID,我们就将 该第一梯队的id,添加到对应的第二梯队的ID下面。这样就完成了第一步统计第二梯队的船相遇第二梯队的船多少次。</li>
</ul>
</li>
<li><p>第二梯队的船与第一梯队的船相遇的次数是怎么样的</p>
<ul>
<li>根据船与船之间相遇关系的文件rx_relation.txt的文件,只要船A的ID以及船B的ID能够与我们上面统计的第二梯队与第一梯队的船对应上(这里的对应上有两种情况 船A的ID属于第一梯队以及船B的id属于第二梯队 或者 船A的ID属于第二梯队以及船B的id属于第一梯队 )这样我们就将这相遇次数 添加进去。</li>
</ul>
<ul>
<li>在这个频率下对应的熟悉度的大小是怎么样的<ul>
<li>读取rx_waitRealation.txt这个文件,计算船舶与船舶之间的熟悉度的大小关系。按照与统计第二梯队的船与第一梯队的船的相遇次数的方式进行匹配熟悉度<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">ship = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/one_twoGroupShips20.txt"</span>)</span><br><span class="line">ship_id = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/Twoships20.txt"</span>)</span><br><span class="line"><span class="comment">## 用来存储第二梯队的船相遇第一梯队的船的数目</span></span><br><span class="line">two_one_nunmber = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/two_one_nunmber20.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line">page_ship = ship.readlines();</span><br><span class="line">page_id = ship_id.readlines();</span><br><span class="line">twog = {}</span><br><span class="line">twoc = {}</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> id <span class="keyword">in</span> page_id:</span><br><span class="line"> id_1 = id.strip(<span class="string">"\n"</span>)</span><br><span class="line"> twoc[str(id_1)] = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> page_ship:</span><br><span class="line"> <span class="keyword">if</span> len(x) > <span class="number">0</span>:</span><br><span class="line"> x_1 = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)[<span class="number">0</span>]</span><br><span class="line"> xx = x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)[<span class="number">1</span>:]</span><br><span class="line"> <span class="keyword">if</span> xx.__contains__(id_1):</span><br><span class="line"> k1 = str(id_1)+<span class="string">"_"</span>+str(x_1)</span><br><span class="line"> twog[k1] =[]</span><br><span class="line"> twoc[str(id_1)] = twoc[str(id_1)]+<span class="number">1</span></span><br><span class="line"><span class="keyword">for</span> k,v <span class="keyword">in</span> twoc.items():</span><br><span class="line"> two_one_nunmber.write(str(k)+<span class="string">" "</span>+str(v)+<span class="string">"\n"</span>)</span><br><span class="line"><span class="comment"># 第二梯队的船与第一梯队的船相遇的次数是怎么样的</span></span><br><span class="line">two_oneship = open(<span class="string">"C:/Users/ouc/Desktop/result/r20_relation.txt"</span>)</span><br><span class="line">two_onepage = two_oneship.readlines()</span><br><span class="line">twog_key = twog.keys()</span><br><span class="line"><span class="keyword">for</span> vd <span class="keyword">in</span> two_onepage:</span><br><span class="line"> line = vd.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> x1 = line[<span class="number">0</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]+<span class="string">"_"</span>+line[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line"> x2 = line[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>] + <span class="string">"_"</span> + line[<span class="number">0</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line"> n = int(line[<span class="number">2</span>])</span><br><span class="line"> <span class="keyword">if</span> twog_key.__contains__(x1) <span class="keyword">or</span> twog_key.__contains__(x2):</span><br><span class="line"> <span class="keyword">if</span> twog_key.__contains__(x1):</span><br><span class="line"> twog[x1].append(n)</span><br><span class="line"> <span class="keyword">if</span> twog_key.__contains__(x2):</span><br><span class="line"> twog[x2].append(n)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 计算相应的熟悉度并进行添加</span></span><br><span class="line">ship_wait = open(<span class="string">"C:/Users/ouc/Desktop/result/r20_waitRelation.txt"</span>)</span><br><span class="line">info = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/r20_two_one_concretely.txt"</span>,<span class="string">"a"</span>)</span><br><span class="line">xx = ship_wait.readlines()</span><br><span class="line">T = <span class="number">12957</span></span><br><span class="line">count = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> xx:</span><br><span class="line"> v =x.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> x1 = v[<span class="number">0</span>].split(<span class="string">"."</span>)[<span class="number">0</span>] + <span class="string">"_"</span> + v[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line"> x2 = v[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>] + <span class="string">"_"</span> + v[<span class="number">0</span>].split(<span class="string">"."</span>)[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">if</span> twog_key.__contains__(x1) <span class="keyword">or</span> twog_key.__contains__(x2):</span><br><span class="line"> <span class="keyword">if</span> len(v)><span class="number">2</span>:</span><br><span class="line"> v = v[<span class="number">2</span>:]</span><br><span class="line"> SUM = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> v[<span class="number">0</span>]!=<span class="string">'12960'</span>:</span><br><span class="line"> count+=<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">for</span> vi <span class="keyword">in</span> v:</span><br><span class="line"> SUM+=(((int(vi)**<span class="number">2</span>)/<span class="number">2</span>))</span><br><span class="line"> <span class="keyword">if</span> SUM ==<span class="number">0.0</span>:</span><br><span class="line"> SUM = T<span class="number">-3</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> sx =T/SUM</span><br><span class="line"> <span class="keyword">if</span> twog_key.__contains__(x1):</span><br><span class="line"> twog[x1].append(sx)</span><br><span class="line"> <span class="keyword">if</span> twog_key.__contains__(x2):</span><br><span class="line"> twog[x2].append(sx)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> k,v <span class="keyword">in</span> twog.items():</span><br><span class="line"> strx = k.split(<span class="string">"_"</span>)[<span class="number">0</span>]+<span class="string">" "</span>+k.split(<span class="string">"_"</span>)[<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">for</span> ix <span class="keyword">in</span> v:</span><br><span class="line"> strx =strx+<span class="string">" "</span>+str(ix)</span><br><span class="line"> strx =strx+<span class="string">"\n"</span></span><br><span class="line"> info.write(strx)</span><br></pre></td></tr></table></figure>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="树状图"><a href="#树状图" class="headerlink" title="树状图"></a>树状图</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">ship = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/r20_two_one_concretely.txt"</span>)</span><br><span class="line">Treejson = open(<span class="string">"C:/Users/ouc/Desktop/twoGroupShip/r20.json"</span>,<span class="string">"a"</span>)</span><br><span class="line">xx = ship.readlines()</span><br><span class="line"></span><br><span class="line">eds = {}</span><br><span class="line"><span class="keyword">for</span> xd <span class="keyword">in</span> xx:</span><br><span class="line"> line = xd.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> eds.keys().__contains__(line[<span class="number">0</span>]):</span><br><span class="line"> fir = {}</span><br><span class="line"> fir[line[<span class="number">1</span>]] = []</span><br><span class="line"> fir[line[<span class="number">1</span>]].append(line[<span class="number">2</span>])</span><br><span class="line"> fir[line[<span class="number">1</span>]].append(line[<span class="number">3</span>])</span><br><span class="line"> eds[line[<span class="number">0</span>]].append(fir)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> eds[line[<span class="number">0</span>]]=[]</span><br><span class="line">father = {}</span><br><span class="line">father[<span class="string">"children"</span>] = []</span><br><span class="line">father[<span class="string">"name"</span>] = <span class="string">"The Two Group ship"</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="keyword">for</span> k,v <span class="keyword">in</span> eds.items():</span><br><span class="line"> one = {}</span><br><span class="line"> one[<span class="string">"children"</span>] = []</span><br><span class="line"> one[<span class="string">"name"</span>] = str(k)</span><br><span class="line"> <span class="keyword">for</span> scx <span class="keyword">in</span> v:</span><br><span class="line"> <span class="keyword">for</span> xsf <span class="keyword">in</span> scx.keys():</span><br><span class="line"> num = {}</span><br><span class="line"> num[<span class="string">"children"</span>] = []</span><br><span class="line"> num[<span class="string">"name"</span>] = xsf</span><br><span class="line"> cishu = {}</span><br><span class="line"> cishu[<span class="string">"children"</span>] = []</span><br><span class="line"> cishu[<span class="string">"name"</span>] = scx[xsf][<span class="number">0</span>]</span><br><span class="line"> num[<span class="string">"children"</span>].append(cishu)</span><br><span class="line"> cf = {}</span><br><span class="line"> cf[<span class="string">"children"</span>] = []</span><br><span class="line"> cf[<span class="string">"name"</span>] = scx[xsf][<span class="number">1</span>]</span><br><span class="line"> num[<span class="string">"children"</span>].append(cf)</span><br><span class="line"> one[<span class="string">"children"</span>].append(num)</span><br><span class="line"> father[<span class="string">"children"</span>].append(one)</span><br><span class="line">print(father)</span><br><span class="line">Treejson.write(str(father))</span><br></pre></td></tr></table></figure>
<p>### </p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//统计船与港口的相遇与不相遇的时间节点 </span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title">getMeetportTime</span><span class="params">(List<String> firstline ,List<List<String>> second)</span> </span>{</span><br><span class="line"> <span class="comment">//定义一个存储上一个时刻的变量</span></span><br><span class="line"> <span class="keyword">double</span> pretime = <span class="number">0.0</span>;</span><br><span class="line"> <span class="comment">//定义一个变量用来 存储船的相遇次数</span></span><br><span class="line"> <span class="keyword">int</span> count = <span class="number">0</span>;</span><br><span class="line"> String secshipid = second.get(<span class="number">0</span>).get(<span class="number">1</span>);</span><br><span class="line"> String firshipid = firstline.get(<span class="number">0</span>);</span><br><span class="line"> System.out.println(<span class="string">"港口"</span>+firshipid+<span class="string">"相遇"</span>+secshipid+<span class="string">"getMeetCount() start"</span>);</span><br><span class="line"> List<String> lStrings = <span class="keyword">new</span> LinkedList<String>();</span><br><span class="line"> lStrings.add(firshipid);</span><br><span class="line"> lStrings.add(secshipid);</span><br><span class="line"> <span class="comment">//初始化一个用来记录两条船相遇时间 节点的链表[1,2]</span></span><br><span class="line"> List<String> timenode = <span class="keyword">new</span> LinkedList<String>();</span><br><span class="line"> <span class="comment">//定义一个变量用来存储在船相遇的时候,伴随了几个间隔</span></span><br><span class="line"> <span class="keyword">int</span> b = <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//定义一个旗帜来表示这段间隔是不是船开始伴随了</span></span><br><span class="line"> <span class="keyword">boolean</span> flag = <span class="keyword">false</span>;</span><br><span class="line"> <span class="comment">//定一个变量来判断表示两个船是不是第一次相遇</span></span><br><span class="line"> <span class="keyword">boolean</span> firstmeetTime = <span class="keyword">true</span>;</span><br><span class="line"> <span class="comment">//定义一个变量来存储第一次相遇的时刻</span></span><br><span class="line"> <span class="keyword">double</span> firtimeet = <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//定义一个变量用来保存 最后一次相遇的时刻</span></span><br><span class="line"> <span class="keyword">double</span> endtimeet = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">if</span>(second.size()>=<span class="number">4</span>) {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<second.size()-<span class="number">1</span>;i++) {</span><br><span class="line"> <span class="comment">//获得第二条船的第i时刻的记录</span></span><br><span class="line"> List<String> secondline = second.get(i);</span><br><span class="line"> <span class="comment">//记录一下当前时刻 </span></span><br><span class="line"> <span class="keyword">double</span> curtime = Double.parseDouble(secondline.get(<span class="number">0</span>));</span><br><span class="line"> <span class="comment">//获得港口的第i时刻的 x y </span></span><br><span class="line"> <span class="keyword">double</span> firstx = Double.parseDouble(firstline.get(<span class="number">0</span>));</span><br><span class="line"> <span class="keyword">double</span> firsty = Double.parseDouble(firstline.get(<span class="number">1</span>));</span><br><span class="line"> <span class="comment">//获得第二条船的第i时刻的x y</span></span><br><span class="line"> <span class="keyword">double</span> secondx = Double.parseDouble(secondline.get(<span class="number">2</span>));</span><br><span class="line"> <span class="keyword">double</span> secondy = Double.parseDouble(secondline.get(<span class="number">3</span>));</span><br><span class="line"> <span class="comment">//计算一下 两个点之间的距离 与 船舶的二倍的通信半径比较一下</span></span><br><span class="line"> <span class="keyword">double</span> x = Math.pow((secondx-firstx), <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">double</span> y = Math.pow((secondy-firsty), <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">double</span> distance = Math.sqrt(x+y);</span><br><span class="line"> <span class="comment">//设置一下船的通信范围</span></span><br><span class="line"> <span class="keyword">double</span> contactRange = <span class="number">20</span>*<span class="number">1.87</span>;</span><br><span class="line"> <span class="keyword">if</span>(distance<=contactRange) {</span><br><span class="line"> <span class="keyword">if</span>(firstmeetTime) {</span><br><span class="line"> firtimeet = curtime;</span><br><span class="line"> firstmeetTime = <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> endtimeet = curtime+<span class="number">3</span>;</span><br><span class="line"> <span class="keyword">if</span>(curtime-pretime><span class="number">3</span>) {</span><br><span class="line"> pretime = curtime;</span><br><span class="line"> count++;</span><br><span class="line"> flag= <span class="keyword">true</span>;</span><br><span class="line"> b++;</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> pretime = curtime;</span><br><span class="line"> flag = <span class="keyword">true</span>;</span><br><span class="line"> b++;</span><br><span class="line"> <span class="comment">//System.out.println("b"+b);</span></span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> flag=<span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(!flag && b!=<span class="number">0</span>) {</span><br><span class="line"> <span class="comment">// System.out.println(flag);</span></span><br><span class="line"> timenode.add(String.valueOf(<span class="string">"["</span>+(pretime-b*<span class="number">3</span>)+<span class="string">","</span>+pretime+<span class="string">"]"</span>));</span><br><span class="line"> b=<span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(b!=<span class="number">0</span>) {</span><br><span class="line"> <span class="comment">//System.out.println("out"+b);</span></span><br><span class="line"> timenode.add(String.valueOf(<span class="string">"["</span>+(pretime-b*<span class="number">3</span>)+<span class="string">","</span>+pretime+<span class="string">"]"</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//伴随的次数</span></span><br><span class="line"> lStrings.add(String.valueOf(count));</span><br><span class="line"> <span class="comment">//每次伴随的时间节点对</span></span><br><span class="line"> lStrings.add(String.valueOf(timenode));</span><br><span class="line"> <span class="comment">//完成伴随需要花费的总的时间</span></span><br><span class="line"> lStrings.add(String.valueOf(endtimeet-firtimeet));</span><br><span class="line"> System.out.println(<span class="string">"船"</span>+firshipid+<span class="string">"相遇"</span>+secshipid+<span class="string">"次数为:"</span>+count);</span><br><span class="line"> System.out.println(<span class="string">"getMeetCount() end"</span>);</span><br><span class="line"> <span class="keyword">return</span> lStrings;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">filepath = open(<span class="string">"C:/Users/ouc/Desktop/result/re20meetTimeNode2.txt"</span>)</span><br><span class="line">filepath2 = <span class="string">"C:/Users/ouc/Desktop/picture/"</span></span><br><span class="line">page = filepath.readlines()</span><br><span class="line">ddct = {}</span><br><span class="line"><span class="keyword">for</span> t <span class="keyword">in</span> range(<span class="number">24574560</span>,<span class="number">24587517</span>,<span class="number">3</span>):</span><br><span class="line"> ddct[t] = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> page:</span><br><span class="line"> lines = line.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> lines[<span class="number">2</span>]!=<span class="string">'0'</span>:</span><br><span class="line"> xd = lines[<span class="number">3</span>:<span class="number">-1</span>]</span><br><span class="line"> p = filepath2+lines[<span class="number">0</span>]+<span class="string">"_"</span>+lines[<span class="number">1</span>]+<span class="string">'.png'</span>;</span><br><span class="line"> <span class="keyword">for</span> v <span class="keyword">in</span> xd:</span><br><span class="line"> vv = v.strip(<span class="string">"["</span>).strip(<span class="string">"]"</span>).strip(<span class="string">","</span>).split(<span class="string">"_"</span>)</span><br><span class="line"> x1 = int(vv[<span class="number">0</span>])</span><br><span class="line"> x2 = int(vv[<span class="number">1</span>])</span><br><span class="line"> <span class="keyword">for</span> ss <span class="keyword">in</span> range(x1,x2,<span class="number">3</span>):</span><br><span class="line"> ddct[ss] = <span class="number">1</span></span><br><span class="line"> print(vv)</span><br><span class="line"> x = []</span><br><span class="line"> y = []</span><br><span class="line"> <span class="keyword">for</span> key, val <span class="keyword">in</span> ddct.items():</span><br><span class="line"> x.append(key)</span><br><span class="line"> y.append(val)</span><br><span class="line"> plt.plot(x, y)</span><br><span class="line"> plt.savefig(p,dpi=<span class="number">300</span>)</span><br><span class="line"> plt.close()</span><br></pre></td></tr></table></figure>
<h3 id="计算两种熟悉度的数值-并进行相关统计"><a href="#计算两种熟悉度的数值-并进行相关统计" class="headerlink" title="计算两种熟悉度的数值 并进行相关统计"></a>计算两种熟悉度的数值 并进行相关统计</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">meet = open(<span class="string">"C:/Users/ouc/Desktop/result/re20meet.txt"</span>)</span><br><span class="line">wa = open(<span class="string">"C:/Users/ouc/Desktop/result/re20.txt"</span>)</span><br><span class="line">ress = open(<span class="string">"C:/Users/ouc/Desktop/result/resss.txt"</span>,<span class="string">"a+"</span>)</span><br><span class="line"><span class="comment"># 初始化一个meet 次数</span></span><br><span class="line">n_map = {}</span><br><span class="line">c_map={}</span><br><span class="line">meet_ship = meet.readlines()</span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> meet_ship:</span><br><span class="line"> ls = line.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> str(ls[<span class="number">2</span>])!=<span class="string">"0"</span>:</span><br><span class="line"> k = str(ls[<span class="number">0</span>])+<span class="string">"_"</span> + str(ls[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>])</span><br><span class="line"> n_map[k] = ls[<span class="number">2</span>]</span><br><span class="line">wa_ship = wa.readlines()</span><br><span class="line">wa_map = {}</span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> wa_ship:</span><br><span class="line"> ls = line.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">if</span> str(ls[<span class="number">2</span>])!=<span class="string">"12960"</span>:</span><br><span class="line"> k = str(ls[<span class="number">0</span>]) + <span class="string">"_"</span> + str(ls[<span class="number">1</span>].split(<span class="string">"."</span>)[<span class="number">0</span>])</span><br><span class="line"> fg = ls[<span class="number">2</span>:]</span><br><span class="line"> <span class="keyword">if</span> len(fg)><span class="number">0</span> <span class="keyword">and</span> n_map.__contains__(k):</span><br><span class="line"> wa_map[k] = []</span><br><span class="line"> <span class="keyword">for</span> ys <span class="keyword">in</span> fg:</span><br><span class="line"> wa_map[k].append(ys)</span><br><span class="line"><span class="comment">### 第一个公式</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">gef</span><span class="params">(ti,n)</span>:</span></span><br><span class="line"> sum = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> ti:</span><br><span class="line"> sum = sum+int(x);</span><br><span class="line"> T = sum/len(ti)</span><br><span class="line"> f = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> y <span class="keyword">in</span> ti:</span><br><span class="line"> f = f+(int(y)-T)**<span class="number">2</span></span><br><span class="line"> f=f/len(ti)</span><br><span class="line"> <span class="keyword">return</span> n/(f**<span class="number">0.005</span>);</span><br><span class="line"><span class="comment"># 第二个公式</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getsd</span><span class="params">(loc,T)</span>:</span></span><br><span class="line"> fd = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">1</span>,len(loc)):</span><br><span class="line"> fd =fd+ ((loc[i]-loc[i<span class="number">-1</span>])**<span class="number">2</span>)/<span class="number">2</span></span><br><span class="line"> <span class="keyword">return</span> T/fd</span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="keyword">for</span> key,item <span class="keyword">in</span> wa_map.items():</span><br><span class="line"> ti = item</span><br><span class="line"> n = int(n_map[key])</span><br><span class="line"> <span class="keyword">if</span> len(ti)><span class="number">0</span>:</span><br><span class="line"> z = gef(ti,n)</span><br><span class="line"> <span class="keyword">if</span> str(n)!=<span class="string">"1"</span>:</span><br><span class="line"> sddx = str(key).split(<span class="string">"_"</span>)[<span class="number">0</span>]+<span class="string">" "</span>+str(key).split(<span class="string">"_"</span>)[<span class="number">1</span>]+<span class="string">" "</span>+str(z)+<span class="string">" "</span>+str(n)+<span class="string">"\n"</span></span><br><span class="line"> ress.write(sddx)</span><br><span class="line"></span><br><span class="line"><span class="comment"># import time</span></span><br><span class="line"><span class="comment"># st = "[3432]]"</span></span><br><span class="line"><span class="comment"># s = st.strip("[").strip("]")</span></span><br><span class="line"><span class="comment"># print(s)</span></span><br><span class="line"><span class="comment"># time.sleep(4)</span></span><br><span class="line"><span class="comment"># print(len(s))</span></span><br></pre></td></tr></table></figure>
<h3 id="港口聚簇分类后对港口进行重新编号"><a href="#港口聚簇分类后对港口进行重新编号" class="headerlink" title="港口聚簇分类后对港口进行重新编号"></a>港口聚簇分类后对港口进行重新编号</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getNewPort</span><span class="params">()</span>:</span></span><br><span class="line"> port_map = {}</span><br><span class="line"> port_map[<span class="number">1</span>] = <span class="number">1</span></span><br><span class="line"> port_map[<span class="number">2</span>] = <span class="number">2</span></span><br><span class="line"> port_map[<span class="number">3</span>] = <span class="number">3</span></span><br><span class="line"> port_map[<span class="number">4</span>] = <span class="number">4</span></span><br><span class="line"> port_map[<span class="number">5</span>] = <span class="number">4</span></span><br><span class="line"> port_map[<span class="number">6</span>] = <span class="number">5</span></span><br><span class="line"> port_map[<span class="number">7</span>] = <span class="number">6</span></span><br><span class="line"> port_map[<span class="number">8</span>] = <span class="number">7</span></span><br><span class="line"> port_map[<span class="number">9</span>] = <span class="number">8</span></span><br><span class="line"> port_map[<span class="number">10</span>] = <span class="number">9</span></span><br><span class="line"> port_map[<span class="number">11</span>] = <span class="number">9</span></span><br><span class="line"> port_map[<span class="number">12</span>] = <span class="number">9</span></span><br><span class="line"> port_map[<span class="number">13</span>] = <span class="number">10</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">14</span>,<span class="number">22</span>):</span><br><span class="line"> port_map[i]=<span class="number">11</span></span><br><span class="line"> port_map[<span class="number">22</span>] = <span class="number">12</span></span><br><span class="line"> port_map[<span class="number">32</span>] = <span class="number">13</span></span><br><span class="line"> port_map[<span class="number">24</span>] = <span class="number">14</span></span><br><span class="line"> port_map[<span class="number">26</span>] = <span class="number">14</span></span><br><span class="line"> port_map[<span class="number">35</span>] = <span class="number">15</span></span><br><span class="line"> port_map[<span class="number">34</span>] = <span class="number">16</span></span><br><span class="line"> port_map[<span class="number">23</span>] = <span class="number">17</span></span><br><span class="line"> port_map[<span class="number">33</span>] = <span class="number">17</span></span><br><span class="line"> port_map[<span class="number">43</span>] = <span class="number">18</span></span><br><span class="line"> port_map[<span class="number">27</span>] = <span class="number">19</span></span><br><span class="line"> port_map[<span class="number">28</span>] = <span class="number">19</span></span><br><span class="line"> port_map[<span class="number">29</span>] = <span class="number">19</span></span><br><span class="line"> port_map[<span class="number">37</span>] = <span class="number">19</span></span><br><span class="line"> port_map[<span class="number">30</span>] = <span class="number">20</span></span><br><span class="line"> port_map[<span class="number">36</span>] = <span class="number">21</span></span><br><span class="line"> port_map[<span class="number">38</span>] = <span class="number">22</span></span><br><span class="line"> port_map[<span class="number">46</span>] = <span class="number">22</span></span><br><span class="line"> port_map[<span class="number">39</span>] = <span class="number">23</span></span><br><span class="line"> port_map[<span class="number">40</span>] = <span class="number">24</span></span><br><span class="line"> port_map[<span class="number">31</span>] = <span class="number">25</span></span><br><span class="line"> port_map[<span class="number">41</span>] = <span class="number">26</span></span><br><span class="line"> port_map[<span class="number">42</span>] = <span class="number">26</span></span><br><span class="line"> port_map[<span class="number">43</span>] = <span class="number">26</span></span><br><span class="line"> port_map[<span class="number">44</span>] = <span class="number">26</span></span><br><span class="line"> <span class="keyword">return</span> port_map</span><br><span class="line">ff = getNewPort()</span><br><span class="line">print(ff)</span><br></pre></td></tr></table></figure>
<h4 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h4><p>原始文件 大小11G,这11G数据是所有的船的数据都混合在一起的,使用Python 进行按照船的编号进行分文件,将同一条船的数据放在一个txt 文件下,分出来的单条船组成的文件的大小,要比原始文件的大小小很多,程序也没有报错!</p>
<h4 id="划分网格-统计船舶在相应海域的密度"><a href="#划分网格-统计船舶在相应海域的密度" class="headerlink" title="划分网格 统计船舶在相应海域的密度"></a>划分网格 统计船舶在相应海域的密度</h4><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line">rootpath = <span class="string">"C:/Users/ouc/Desktop/data/New201609/Sample1"</span></span><br><span class="line">targetpath = open(<span class="string">"C:/Users/ouc/Desktop/result/201609s.txt"</span>,<span class="string">"a+"</span>)</span><br><span class="line">ls = os.listdir(rootpath)</span><br><span class="line">arr = [[<span class="number">0</span> <span class="keyword">for</span> col <span class="keyword">in</span> range(<span class="number">1000</span>)] <span class="keyword">for</span> row <span class="keyword">in</span> range(<span class="number">0</span>,<span class="number">1000</span>)]</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">getY</span><span class="params">(lon1,lat1,lon2,lat2,lat3)</span>:</span></span><br><span class="line"> k = (lat2-lat1)/(lon2-lon1)</span><br><span class="line"> b = lat2-k*lon2</span><br><span class="line"> <span class="keyword">return</span> (lat3-b)/k</span><br><span class="line"><span class="comment">#设置经纬度的范围</span></span><br><span class="line">minLat = <span class="number">25</span></span><br><span class="line">maxLat = <span class="number">35</span></span><br><span class="line">minLon = <span class="number">120</span></span><br><span class="line">maxLon = <span class="number">130</span></span><br><span class="line">Ilon = (maxLon-minLon)/<span class="number">1000</span></span><br><span class="line">Ilat = (maxLat-minLat)/<span class="number">1000</span></span><br><span class="line">print(Ilon)</span><br><span class="line"></span><br><span class="line">print(len(arr))</span><br><span class="line"><span class="keyword">for</span> p <span class="keyword">in</span> ls:</span><br><span class="line"> path = rootpath+<span class="string">"/"</span>+p;</span><br><span class="line"> page = open(path).readlines()</span><br><span class="line"> <span class="keyword">for</span> line <span class="keyword">in</span> page:</span><br><span class="line"> l = line.strip(<span class="string">"\n"</span>).split(<span class="string">" "</span>);</span><br><span class="line"> lon = float(l[<span class="number">4</span>])/<span class="number">600000</span></span><br><span class="line"> lat = float(l[<span class="number">3</span>])/<span class="number">600000</span></span><br><span class="line"> <span class="keyword">if</span> lon>=<span class="number">120</span> <span class="keyword">and</span> lon<=<span class="number">130</span> <span class="keyword">and</span> lat<=<span class="number">35</span> <span class="keyword">and</span> lat>=<span class="number">25</span>:</span><br><span class="line"> x = int((lon - minLon) / Ilon)</span><br><span class="line"> y = int((lat - minLat) / Ilat)</span><br><span class="line"> lony =<span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> lat>=<span class="number">32.62170</span> <span class="keyword">and</span> lat<=<span class="number">35</span>:</span><br><span class="line"> lony = getY(<span class="number">121.39759</span>,<span class="number">34.040604</span>,<span class="number">121.898542</span>,<span class="number">32.62170</span>,lat)</span><br><span class="line"> <span class="keyword">if</span> lat<<span class="number">32.62170</span> <span class="keyword">and</span> lat>=<span class="number">32.02698</span>:</span><br><span class="line"> lony = getY(<span class="number">121.898542</span>,<span class="number">32.62170</span>,<span class="number">122.742584</span>,<span class="number">32.02698</span>,lat)</span><br><span class="line"> <span class="keyword">if</span> lat<<span class="number">32.02698</span> <span class="keyword">and</span> lat>=<span class="number">30.68529</span>:</span><br><span class="line"> lony = getY(<span class="number">122.742584</span>,<span class="number">32.02698</span>,<span class="number">123.836783</span>,<span class="number">30.68529</span>,lat)</span><br><span class="line"> <span class="keyword">if</span> lat<<span class="number">30.68529</span> <span class="keyword">and</span> lat>=<span class="number">28.312783</span>:</span><br><span class="line"> lony = getY(<span class="number">123.836783</span>,<span class="number">30.68529</span>,<span class="number">122.613561</span>,<span class="number">28.312783</span>,lat)</span><br><span class="line"> <span class="keyword">if</span> lat < <span class="number">28.312783</span> <span class="keyword">and</span> lat >= <span class="number">25.625886</span>:</span><br><span class="line"> lony = getY(<span class="number">122.613561</span>,<span class="number">28.312783</span>, <span class="number">120</span>,<span class="number">25.625886</span>, lat)</span><br><span class="line"> <span class="keyword">if</span> lony < lon:</span><br><span class="line"> print(lony,<span class="string">":"</span>,lon)</span><br><span class="line"> arr[y][x] = arr[y][x] + <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">mx = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> arr:</span><br><span class="line"> li =<span class="string">""</span></span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> i:</span><br><span class="line"> li=li+(<span class="string">" "</span>+str(j))</span><br><span class="line"> <span class="keyword">if</span> j>mx:</span><br><span class="line"> mx = j</span><br><span class="line"> targetpath.write(li+<span class="string">"\n"</span>)</span><br><span class="line">print(mx)</span><br></pre></td></tr></table></figure>
<h5 id="统计船所属的港口"><a href="#统计船所属的港口" class="headerlink" title="统计船所属的港口"></a>统计船所属的港口</h5>
</div>
<div class="article-info article-info-index">
<div class="counter-tag counter">
<span id="/2021/03/30/Ad Hoc(二)/" class="leancloud_visitors post-title-link" style="font-size: 12px" data-flag-title="Ad Hoc(二)">
view
</span>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-三种I_O模型知识梳理" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/03/28/三种I_O模型知识梳理/" class="article-date">
<time datetime="2021-03-28T12:56:15.050Z" itemprop="datePublished">2021-03-28</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/03/28/三种I_O模型知识梳理/">
三种I_O模型知识梳理
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>这块知识一直感觉挺不好理解的,现有的介绍的文章感觉总结的不是很全,所以自己总结了一版!</p>
<h1 id="一、基本概念"><a href="#一、基本概念" class="headerlink" title="一、基本概念"></a>一、基本概念</h1><ul>
<li><strong><em>BIO(Basic Input Output)</em></strong> :就是传统的I/O操作,同步阻塞IO,当BufferReader 读取输入流中的数据的时候,如果没有读取到有效的数据,程序将在此处阻塞该线程的执行。这里的B有两个意思 一个是Basic 另一个意思为Block 翻译为阻塞。服务器实现模式为一个连接一个线程,即客户端有连接请求的时候,</li>
<li><strong><em>NIO:(New Input Output)</em></strong> :同步非阻塞I/O,也可以翻译为Non-Block Input/Output,新的IO使用了不同的方式来处理输入/输出,新IO采用内存映射文件的方式来处理输入输出,新IO将文件或者文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了。服务器实现模式为一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求的时候才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这需要用户进行不停的去询问。 </li>
<li><strong><em>AIO:(Asynchronous Input Output</em></strong>):异步非阻塞的IO操作,AIO是在Java7中引入了NIO的改进版NIO2,这是异步IO模型。异步能力最大的一个特点就是异步能力,是一种在读写操作结束之前允许进行其他操作的I/O操作。应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。</li>
</ul>
<h1 id="二、同步与异步,阻塞与非阻塞的理解"><a href="#二、同步与异步,阻塞与非阻塞的理解" class="headerlink" title="二、同步与异步,阻塞与非阻塞的理解"></a>二、同步与异步,阻塞与非阻塞的理解</h1><ul>
<li>阻塞<br> 阻塞其实就是等待的意思,调用者发起请求如果不能立即拿到结果就一直等,等到结果完成。</li>
<li>非阻塞<br>非阻塞就是调用者发起请求后会立即返回,没有等待的过程,但是要自己不断去检查是否已有结果。<ul>
<li>同步<br>当前线程发起了一个调用或者请求,然后当前线程需要等待该调用结束返回结果才能继续往下进行其他操作。</li>
<li>异步<br>当前线程发起了一个调用请求或请求,然后当前线程不需要等待调用的执行结果就可以继续往下执行。<br><strong>下面我们将阻塞与异步结合在一起进行理解一下:</strong><ul>
<li>同步阻塞:你到饭馆点餐,然后在那里等着,还要一边喊:好了没!饭好了可以吃了。</li>
<li>同步非阻塞:在饭馆点完餐,就去遛狗了,不过遛了一会,就回饭馆喊一声:好了没!</li>
<li>异步阻塞: 在饭馆点完餐,就去遛狗了,遛狗的时候,饭馆给你打电话说饭做好了,让您亲自去拿。</li>
<li>异步非阻塞: 在饭馆点完餐,就去遛狗了,遛狗的时候,饭馆给你打电话说饭做好了,饭馆打电话说,我们知道您的位置,一会给您送过去,安心遛狗就可以了。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="什么是I-O?"><a href="#什么是I-O?" class="headerlink" title="什么是I/O?"></a>什么是I/O?</h1><p>上面我们对阻塞/非阻塞,异步/同步进行了理解,下面在来了解一下什么是IO</p>
<h2 id="计算机体系结构"><a href="#计算机体系结构" class="headerlink" title="计算机体系结构"></a>计算机体系结构</h2><p><img src="https://img-blog.csdnimg.cn/20210322113007435.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="冯诺伊曼计算机的体系结构"><br>冯诺依曼的计算机体系结构分为输入设备,计算器,控制器,运算器以及输出设备,这里的IO指的就是 输入输出设备。<br>为了保证输入输出的安全性以及稳定性,一个进程的地址空间分为<code>用户空间</code>以及<code>内核空间</code>。</p>
<ul>
<li>用户空间 我们平时的应用程序都是运行在用户空间,是用户程序运行的地方。</li>
<li>内核空间 内核空间才能进行系统级别的资源有关的操作,是内核代码的运行空间。<br>用户空间与内核空间是相互隔离的,我们想要进行IO操作是要依赖内核空间的能力,但是用户空间的程序是不能直接访问内核空间的,要执行IO操作的时候,<strong><em>由于没有执行权限就要发起系统调用请求来请求操作系统帮忙完成。</em></strong><br>我们常见的IO主要分为<code>磁盘IO(读写文件)</code> 与<code>网络IO(网络请求)</code><br>在应用程序的角度来看,我们的应用程序其实就是对操作系统的内核发起IO调用,操作系统负责的内核执行具体的IO操作。也就是说,我们的应用程序其实就是发起了Io操作而已,具体执行IO的还是操作系统的内核。<h1 id="NIO的基本概念理解"><a href="#NIO的基本概念理解" class="headerlink" title="NIO的基本概念理解"></a>NIO的基本概念理解</h1>关于IO的基本概念,我已经在另外一篇文章中进行了总结,这里只对NIO的几个关键词进行总结。<br>channel 与buffer是新IO中的两个核心对象。</li>
<li>Channel (通道)<br> 通道是对传统输入输出系统的模拟,在NIO中,所有的数据都需要通过通道进行传输,Channel与传统的InputStream以及OutputStream的主要区别在与它提供了一个map方法,可以通过map方法直接将“一块数据”映射到内存中,这样就实现了传统的输入输出是面向流处理的,但是NIO是面向块处理的。而且通道不同于流的地方还在于通道是双向的,底层的操作系统的通道一般都是全双工的。代表连接到数据源的通道。</li>
<li>Buffer(缓冲区)<br>Buffer可以理解成一个容器,它的本质是一个数组,发送到channel中的对象都被存放在Buffer中,从channel中读取的数据也必须先放在Buffer中。我们不能直接对channel进行操作,Buffer的主要作用就是用来与NIO进行交互的,数据是从通道中读入缓冲区,从缓冲区写入通道中的。<h3 id="channel-与Buffer的关系"><a href="#channel-与Buffer的关系" class="headerlink" title="channel 与Buffer的关系"></a>channel 与Buffer的关系</h3>channel 是通道的含义,数据不可以直接在channel上进行处理,必须要把数据读取到缓冲区Buffer中,从通道中读取数据到缓冲区中,从缓冲区写入数据到通道。<ul>
<li>多路复用器 Selector 多路复用器<br>java NIO 三大基本组件Channel、Buffer、Selector,三大组件的关系<br>Selector 提供选择已经就绪的任务的能力。<br>Selector 轮询注册在其上的Channel,如果某个Channel发生多谢请求并且Channel就处于就绪状态,会被Selector轮询出来。然后通过SelectionKey可以获取就绪Channel集合,进行后续的I/O操作。一个Selector 可以同时轮询多个Channel,因为JDK使用了epoll()代替传统的select实现,所以就没有最大句柄1024/1024的限制,所以只需要一个线程负责轮询就可以接入成千上万的客户端。<br><img src="https://img-blog.csdnimg.cn/20210322144153369.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="selector与channel的关系"><br><img src="https://img-blog.csdnimg.cn/20210322144341179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="channel与buffer的关系"><h1 id="三种常见的IO的理解"><a href="#三种常见的IO的理解" class="headerlink" title="三种常见的IO的理解"></a>三种常见的IO的理解</h1><h3 id="BIO"><a href="#BIO" class="headerlink" title="BIO"></a>BIO</h3><img src="https://img-blog.csdnimg.cn/20210322145242547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>同步阻塞模型中,应用程序发起read之后,会一直阻塞,直到内核将数据拷贝到用户空间。<h3 id="NIO-模型"><a href="#NIO-模型" class="headerlink" title="NIO 模型"></a>NIO 模型</h3>java中的NIO可以理解为I/O多路复用模型。<br><img src="https://img-blog.csdnimg.cn/20210322151509523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>NIO同步非阻塞,一个线程在同步的进行轮询检查,Selector 不断的轮询注册在其上的Channel,某个Channel 上面连续发生读写连接请求,这个Channel就处于就绪状态,被Selector轮询出来,然后通过SelectionKey就可以获取就绪Channel的集合,进行后续的操作。<br><img src="https://img-blog.csdnimg.cn/20210322152054629.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="I/O多路复用操纵"><br>IO多路复用模型中,线程首先发起select调用,询问内核数据是否已经准备就绪,等内核把数据准备好了,用户线程再发起read调用,read调用的过程(数据从内核空间-> 用户空间)还是阻塞的。<br><img src="https://img-blog.csdnimg.cn/20210323144745667.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></li>
</ul>
</li>
</ul>
<h3 id="AIO模型"><a href="#AIO模型" class="headerlink" title="AIO模型"></a>AIO模型</h3><p><img src="https://img-blog.csdnimg.cn/20210323144614564.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<p>是在NIO的基础上引入异步通道的概念,实现异步非阻塞式的IO处理。AIO 不需要通过多路复用器对注册的通道进行轮询操作即可实现异步读写。NIO采用轮询的方式,一直在轮询的询问stream中的数据是否准备就绪,如果准备就绪就发起处理,但是AIO就不需要了,AIO框架在windows下使用windows IOCP技术,在Liunx下使用epoll多路复用技术模拟异步IO,即:应用程序向操作系统注册IO监听,然后继续做自己的事情。操作系统发生IO事件,并且准备好数据后,在主动的通知应用程序,触发相应的函数(这是以一种订阅者模式进行改造)。由于应用程序不是“轮询”方式而是订阅-通知方式,所以不在需要selector 轮询,由channel 通道直接到操作系统注册监听。</p>
<h1 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h1><ul>
<li>BIO<br>适用于连接数目比较少且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,编程比较复杂,程序简单易于理解。</li>
<li>NIO<br>适用于连接数目比较多的情况下,并且连接比较短(轻操作)的架构。比如聊天服务器。</li>
<li>AIO<br>适用于连接数目比较多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂<h1 id="调用总结"><a href="#调用总结" class="headerlink" title="调用总结"></a>调用总结</h1><img src="https://img-blog.csdnimg.cn/2021032314521790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></li>
</ul>
</div>
<div class="article-info article-info-index">
<div class="counter-tag counter">
<span id="/2021/03/28/三种I_O模型知识梳理/" class="leancloud_visitors post-title-link" style="font-size: 12px" data-flag-title="三种I_O模型知识梳理">
view
</span>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-2021年华为软件精英挑战赛总结" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/03/28/2021年华为软件精英挑战赛总结/" class="article-date">
<time datetime="2021-03-28T12:50:09.060Z" itemprop="datePublished">2021-03-28</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/03/28/2021年华为软件精英挑战赛总结/">
2021年华为软件精英挑战赛总结
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p> <strong>很幸运得了一个 前64名,但是整个过程是非常紧张的</strong><br> <a href="https://github.com/CattleZ/MacLearngit/tree/master/%E5%8D%8E%E4%B8%BA%E6%8C%91%E6%88%98%E6%9D%AF" target="_blank" rel="noopener">相关赛题,以及代码</a><br> 这是在海大上研究生以来第一次正式参加比赛,距离上次参加类似的比赛已经过去将近三年了,这种参加比赛的感觉依旧还是没有改变。<br> 参加这次比赛大约用了12天的时间,比赛只允许最多三个人参加比赛。第一次参加华为精英杯挑战赛,还是缺少一些经验的。过程就是刚开始先拿到了题目,团队中三个人各自研究各自的,然后每个人根据自己的理解,去写自己对这个题目的理解,然后开始根据自己的思路开始写。<br> (其实这时候,我们对题目的理解还不是很好,每个人的理解方式也不一样~~)这儿我们做的还不是很好(可以先统一看题目,然后一块根据题目的意思进行讲解,先对题目进行一个透彻的分析~~然后一个团队在开始进行工作)这样就能更高效的写出准确的代码,团队的作用没有发挥出来。对题目进行一个准确的理解,并且商定好解决方案,是要比各自为战更能得到一个好的结果与效率。<br> 对于这一次比赛,缺乏相关的理论知识,在算法设计上相对来说比较简单的,有时候价格的降低,其实只是对参数的多次调整,才获得的结果,并没有能真正的理解结果产生的原因。对于这个比赛,其实有一定相关计算机编程基础都会得到一定的答案,但是答案却不一定是最优解,所以我们很快就写了一个解决方案,这个方案的花费是不低的,后期还是要调的。其实,写这么一个过程并不难,主要是思路是不是清晰,解决方案是不是合理。</p>
<h1 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h1><p> 我们队伍的解题思路是对于购买方案:既然最终的目的是花费最少,我们在购买服务器的时候的选择就是首先购买能满足虚拟机部署条件的,服务器的日均花费最少(固定价格+每天的电费* 使用的天数)/天数<br> 。这样首先对已经提供的服务器按照我们的日均花费最少进行一个从小到大的排序。选择的时候,就会优先选择能满足条件的花费最少的服务器。我们队伍是一条一条命令解析的,这样其实是很难优化的。按照题目的意思应该是一天结束后,对这一天的命令进行统一解析,统一购买。哎~~刚开始的时候,也没考虑好这些问题。每进来一台虚拟机,我们都会查看当前的服务器是否能进行部署,部署的策略就是均衡服务器的内存,让服务器能够最大限度的利用内存。对于迁移策略,刚开始是没有考虑迁移策略的,这也是前期设计上的不足,迁移策略是后期又更改代码加上去的。迁移的策略就是对于整个服务器集群上的所有服务器包含的虚拟机的数量,如果该服务器上只有一台虚拟机,我们就对这台服务器上的虚拟机进行迁移,被迁移到的服务器上已有的服务器数量不能小于一,因为我们迁移的目的是能够空出更大的内存以及CPU,然后节省下当天的电费。这样在每天开始购买服务器或者删除虚拟机之前,就对之前的服务器集群的状态进行一次更改,然后在释放内存以及内核。我们的思路比较简单。</p>
<h1 id="成长"><a href="#成长" class="headerlink" title="成长"></a>成长</h1><p> 经过这次比赛,也让我成长了一些,在与团队成员进行交流的时候,认识到了自己的一些不足的地方,数学知识,算法有待加强,自己在编写程序的时候,设置的变量名称一定要能表达该变量所传达的意思。避免随意起名。在整个过程中,还感觉到自己的逻辑思维还是有待加强的,在编写的时候,明明感觉没有错误了,但是在真正运行的时候还是会出现问题,然后在去查找错误,是非常浪费时间的,不如一开始就思考好,编写的逻辑,尽量减少自己逻辑上的错误。通过与团队成员的交流,也学到了许多良好的学习方法以及编程习惯。<br><img src="https://img-blog.csdnimg.cn/20210328190950966.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
</div>
<div class="article-info article-info-index">
<div class="counter-tag counter">
<span id="/2021/03/28/2021年华为软件精英挑战赛总结/" class="leancloud_visitors post-title-link" style="font-size: 12px" data-flag-title="2021年华为软件精英挑战赛总结">
view
</span>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-浏览器的工作原理:新式网络浏览器幕后揭秘(收藏 )" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/03/10/浏览器的工作原理:新式网络浏览器幕后揭秘(收藏 )/" class="article-date">
<time datetime="2021-03-10T08:26:34.480Z" itemprop="datePublished">2021-03-10</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/03/10/浏览器的工作原理:新式网络浏览器幕后揭秘(收藏 )/">
浏览器的工作原理:新式网络浏览器幕后揭秘(收藏 )
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>这篇文章写的太深入了~~先收藏下来慢慢研究😂😂😂</p>
<p><a href="http://www.hankle.link/browser/" target="_blank" rel="noopener">文章链接</a></p>
</div>
<div class="article-info article-info-index">
<div class="counter-tag counter">
<span id="/2021/03/10/浏览器的工作原理:新式网络浏览器幕后揭秘(收藏 )/" class="leancloud_visitors post-title-link" style="font-size: 12px" data-flag-title="浏览器的工作原理:新式网络浏览器幕后揭秘(收藏 )">
view
</span>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-多线程实战之批处理一个文件夹下的文件总结" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/02/05/多线程实战之批处理一个文件夹下的文件总结/" class="article-date">
<time datetime="2021-02-05T03:39:28.250Z" itemprop="datePublished">2021-02-05</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/02/05/多线程实战之批处理一个文件夹下的文件总结/">
多线程实战之批处理一个文件夹下的文件总结
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="项目背景"><a href="#项目背景" class="headerlink" title="项目背景"></a>项目背景</h2><p>现有4个G的船舶轨迹数据,按照船号存储在一个文件夹下,我需要对这些数据进行处理一下,按照单线程的方式,处理起来有点浪费时间,为了提高效率,提高电脑CPU的利用率,打算将数据使用多线程的方式进行处理一下。</p>
<h2 id="项目代码"><a href="#项目代码" class="headerlink" title="项目代码"></a>项目代码</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> InitShip;</span><br><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStreamWriter;</span><br><span class="line"><span class="keyword">import</span> java.nio.Buffer;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.LinkedList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.CountDownLatch;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FileThread</span> <span class="keyword">extends</span> <span class="title">Thread</span></span>{</span><br><span class="line"> Tool tool = <span class="keyword">new</span> Tool();</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> CountDownLatch countDownL = <span class="keyword">new</span> CountDownLatch(<span class="number">10</span>);</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">int</span> fileIndex;</span><br><span class="line"> <span class="keyword">private</span> List<String> fileList;</span><br><span class="line"> <span class="keyword">private</span> String filepath=<span class="string">""</span>;</span><br><span class="line"> <span class="keyword">private</span> String movepath=<span class="string">""</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getFilepath</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> filepath;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setFilepath</span><span class="params">(String filepath)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.filepath = filepath;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getMovepath</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> movepath;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setMovepath</span><span class="params">(String movepath)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.movepath = movepath;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getFileIndex</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> fileIndex;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setFileIndex</span><span class="params">(<span class="keyword">int</span> fileIndex)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.fileIndex = fileIndex;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> List<String> <span class="title">getFileList</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> fileList;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setFileList</span><span class="params">(List<String> fileList)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.fileList = fileList;</span><br><span class="line"> }</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<fileList.size();i++) {</span><br><span class="line"> <span class="keyword">if</span>(i%<span class="number">10</span> == fileIndex) {</span><br><span class="line"> <span class="comment">//下面三行代码写逻辑代码的地方,可以将想要更改的文件逻辑添加在这个地方</span></span><br><span class="line"> List<List<String>> allList =tool.readFILEN(filepath+fileList.get(i));</span><br><span class="line"> String value = tool.WriteValue(allList);</span><br><span class="line"> <span class="comment">//readFile.renameTo(new File(movepath+readFile.getName()));</span></span><br><span class="line"> tool.writerFile(movepath+fileList.get(i),value);</span><br><span class="line"> }</span><br><span class="line"> countDownL.countDown();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span> <span class="keyword">throws</span> InterruptedException </span>{</span><br><span class="line"> String filepath = <span class="string">"C:\\Users\\ouc\\Desktop\\data\\202101perupd_test\\"</span>;</span><br><span class="line"> String movepath = <span class="string">"C:\\Users\\ouc\\Desktop\\data\\202101perupd\\"</span>;</span><br><span class="line"> File file = <span class="keyword">new</span> File(filepath);</span><br><span class="line"> String [] fileList = file.list();</span><br><span class="line"> List<String> fList = <span class="keyword">new</span> ArrayList<String>();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<fileList.length;i++) {</span><br><span class="line"> fList.add(fileList[i]);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">10</span>;i++) {</span><br><span class="line"> FileThread fileThread = <span class="keyword">new</span> FileThread();</span><br><span class="line"> fileThread.setFileIndex(i);</span><br><span class="line"> fileThread.setFileList(fList);</span><br><span class="line"> fileThread.setFilepath(filepath);</span><br><span class="line"> fileThread.setMovepath(movepath);</span><br><span class="line"> fileThread.start();</span><br><span class="line"> }</span><br><span class="line"> countDownL.await();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="相关知识记录"><a href="#相关知识记录" class="headerlink" title="相关知识记录"></a>相关知识记录</h2><h3 id="文件读写操作"><a href="#文件读写操作" class="headerlink" title="文件读写操作"></a>文件读写操作</h3><h3 id="CountDownLatch"><a href="#CountDownLatch" class="headerlink" title="CountDownLatch"></a>CountDownLatch</h3><p>在java.util.concurrent.CountDownLatch;包下的一个工具类,countDownLatch这个类使得一个线程或者多个线程等待其他线程各自执行完毕之后在执行。</p>
<h4 id="两种使用场景"><a href="#两种使用场景" class="headerlink" title="两种使用场景"></a>两种使用场景</h4><ul>
<li>让多个线程等待</li>
<li>让单个线程等待<h4 id="构造器"><a href="#构造器" class="headerlink" title="构造器"></a>构造器</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//参数count为计数值</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">CountDownLatch</span><span class="params">(<span class="keyword">int</span> count)</span></span>{}</span><br></pre></td></tr></table></figure>
</li>
</ul>
<h4 id="主要方法"><a href="#主要方法" class="headerlink" title="主要方法"></a>主要方法</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//调用await()方法的线程会被挂起,它会等待直到count的值为0的时候才继续执行</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">await</span><span class="params">()</span></span></span><br><span class="line"><span class="function"><span class="comment">//和await()类似,只不过等待一定的时间后count的值还没有变为0的话就继续执行</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">await</span><span class="params">(<span class="keyword">long</span> timeout,TimeUnit unit)</span></span></span><br><span class="line"><span class="function"><span class="comment">//执行将count的值减一</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">countDown</span><span class="params">()</span></span>{};</span><br></pre></td></tr></table></figure>
<h4 id="让多个线程等待,模拟并发"><a href="#让多个线程等待,模拟并发" class="headerlink" title="让多个线程等待,模拟并发"></a>让多个线程等待,模拟并发</h4><p>并发线程一起执行,例如在指定的时刻进行秒杀,线程准备就绪后,进行等待,直到秒杀时刻的到来,然后一起执行。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FileThread</span> <span class="keyword">extends</span> <span class="title">Thread</span></span>{</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> CountDownLatch countDownL = <span class="keyword">new</span> CountDownLatch(<span class="number">1</span>);</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> countDownL.await();</span><br><span class="line"> String parter =<span class="string">"["</span>+Thread.currentThread().getName()+<span class="string">"]"</span>;</span><br><span class="line"> System.out.println(parter+<span class="string">"开始执行"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (InterruptedException e) {</span><br><span class="line"> <span class="comment">// TODO Auto-generated catch block</span></span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span> <span class="keyword">throws</span> InterruptedException </span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">5</span>;i++) {</span><br><span class="line"> <span class="keyword">new</span> FileThread().start();</span><br><span class="line"> }</span><br><span class="line"> Thread.sleep(<span class="number">2000</span>);</span><br><span class="line"> countDownL.countDown();</span><br><span class="line"> } </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="让单个线程等待,多个线程任务完成后,进行汇总合并"><a href="#让单个线程等待,多个线程任务完成后,进行汇总合并" class="headerlink" title="让单个线程等待,多个线程任务完成后,进行汇总合并"></a>让单个线程等待,多个线程任务完成后,进行汇总合并</h4><p>很多时候,并发任务存在前后依赖关系,例如:多个数据操作完成后,需要数据check,这是在多个线程任务完成后,进行汇总合并的场景。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> CountDownLatch countDownL = <span class="keyword">new</span> CountDownLatch(<span class="number">5</span>);</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>{</span><br><span class="line"> System.out.println(<span class="string">"finish"</span>+Thread.currentThread().getName());</span><br><span class="line"> countDownL.countDown();</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span> <span class="keyword">throws</span> InterruptedException </span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">5</span>;i++) {</span><br><span class="line"> <span class="keyword">new</span> FileThread().start();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//Thread.sleep(2000);</span></span><br><span class="line"> countDownL.await();</span><br><span class="line"> System.out.println(<span class="string">"主线程:在所有的任务完成后,执行"</span>);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h4><p>CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。<br>调用await()方法的线程会被阻塞,直到计数器减到0的时候,才能继续往下执行。<br>调用await()进行阻塞等待的线程,他们被阻塞,这样所有的线程都能在同一个起跑线上<br>countDown()方法则是将计数器减1;当减为0的时候,就继续往下执行。</p>
<h2 id="项目代码解读"><a href="#项目代码解读" class="headerlink" title="项目代码解读"></a>项目代码解读</h2><p>首先创建了一个CountDownLatch的工具,初始值为10,设置一个文件的index,以及文件路径的列表,该类继承了Thread,因此需要重写run()方法,这里我们要使用的是第二种场景,让单线程,等待多线程的过程,虽然我们后续没有其他任务要继续执行。在run 方法里面,线程开始执行我们编写好的逻辑代码,执行完成一个之后,countDown就会减一,countDownLatch的值设置为全局的,因此,我们创建的10个线程,每次执行都会使得countDown减一,run()方法里面的if(i%10 == fileIndex) 表示了10个线程,需要负责的文件的数量。这样就实现了10个线程同时进行文件操作的过程。</p>
</div>
<div class="article-info article-info-index">
<div class="counter-tag counter">
<span id="/2021/02/05/多线程实战之批处理一个文件夹下的文件总结/" class="leancloud_visitors post-title-link" style="font-size: 12px" data-flag-title="多线程实战之批处理一个文件夹下的文件总结">
view
</span>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-Win10 系统MySQL8.0 忘记管理员密码,重新设置新的密码" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/02/05/Win10 系统MySQL8.0 忘记管理员密码,重新设置新的密码/" class="article-date">
<time datetime="2021-02-05T03:37:13.010Z" itemprop="datePublished">2021-02-05</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/02/05/Win10 系统MySQL8.0 忘记管理员密码,重新设置新的密码/">
Win10 系统MySQL8.0 忘记管理员密码,重新设置新的密码
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="首先使用管理员权限登录CMD"><a href="#首先使用管理员权限登录CMD" class="headerlink" title="首先使用管理员权限登录CMD"></a>首先使用管理员权限登录CMD</h2><p>右键系统菜单–>选择Windows PowerShell(管理员)(A)启动管理员cmd</p>
<h2 id="查看现有进程是否含有mysql"><a href="#查看现有进程是否含有mysql" class="headerlink" title="查看现有进程是否含有mysql"></a>查看现有进程是否含有mysql</h2><p>使用tasklist能列出所有的进程,和相应的信息。如果包含Mysql的开头的进程,一律杀死即可<br>tskill能查杀进程,语法很简单:tskill 程序名!!</p>
<h2 id="切换命令行路径到Mysql的bin目录下"><a href="#切换命令行路径到Mysql的bin目录下" class="headerlink" title="切换命令行路径到Mysql的bin目录下"></a>切换命令行路径到Mysql的bin目录下</h2><p>我是一步一步退出在重新进入的。<br><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">PS C:\Windows\system32> cd ..</span><br><span class="line">PS C:\Windows> cd ..</span><br><span class="line">PS C:\> ls</span><br><span class="line">PS C:\> cd <span class="string">'.\Program Files\'</span></span><br><span class="line">PS C:\Program Files> cd .\MySQL\</span><br><span class="line">PS C:\Program Files\MySQL> cd <span class="string">'.\MySQL Server 8.0\'</span></span><br><span class="line">PS C:\Program Files\MySQL\MySQL Server <span class="number">8.0</span>> cd bin</span><br></pre></td></tr></table></figure></p>
<h2 id="执行跳过权限认证的命令"><a href="#执行跳过权限认证的命令" class="headerlink" title="执行跳过权限认证的命令"></a>执行跳过权限认证的命令</h2><p>8版本与前面的版本不一样,语法上是有区别的,注意区分<br><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysqld --console --skip-grant-tables --shared-memory</span><br></pre></td></tr></table></figure></p>
<h3 id="错误及处理"><a href="#错误及处理" class="headerlink" title="错误及处理"></a>错误及处理</h3><p>我在运行的时候,出现了下面的错误,错误原因是 console没有安装<br><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">2021</span>-<span class="number">02</span>-<span class="number">05</span>T02:<span class="number">45</span>:<span class="number">36.329602</span>Z <span class="number">0</span> [System] [MY-<span class="number">010116</span>] [Server] C:\Program Files\MySQL\MySQL Server <span class="number">8.0</span>\bin\mysqld.exe (mysqld <span class="number">8.0</span>.<span class="number">22</span>) starting as <span class="keyword">process</span> <span class="number">17040</span></span><br><span class="line"><span class="number">2021</span>-<span class="number">02</span>-<span class="number">05</span>T02:<span class="number">45</span>:<span class="number">36.332291</span>Z <span class="number">0</span> [Warning] [MY-<span class="number">010091</span>] [Server] Can<span class="string">'t create test file C:\Program Files\MySQL\MySQL Server 8.0\data\mysqld_tmp_file_case_insensitive_test.lower-test</span></span><br><span class="line"><span class="string">2021-02-05T02:45:36.332400Z 0 [Warning] [MY-010091] [Server] Can'</span>t create test file C:\Program Files\MySQL\MySQL Server <span class="number">8.0</span>\data\mysqld_tmp_file_case_insensitive_test.lower-test</span><br><span class="line"><span class="number">2021</span>-<span class="number">02</span>-<span class="number">05</span>T02:<span class="number">45</span>:<span class="number">36.332547</span>Z <span class="number">0</span> [ERROR] [MY-<span class="number">013276</span>] [Server] Failed to set datadir to <span class="string">'C:\Program Files\MySQL\MySQL Server 8.0\data\'</span> (OS errno: <span class="number">2</span> - No such file or directory)</span><br><span class="line"><span class="number">2021</span>-<span class="number">02</span>-<span class="number">05</span>T02:<span class="number">45</span>:<span class="number">36.346381</span>Z <span class="number">0</span> [ERROR] [MY-<span class="number">010119</span>] [Server] Aborting</span><br><span class="line"><span class="number">2021</span>-<span class="number">02</span>-<span class="number">05</span>T02:<span class="number">45</span>:<span class="number">36.346516</span>Z <span class="number">0</span> [System] [MY-<span class="number">010910</span>] [Server] C:\Program Files\MySQL\MySQL Server <span class="number">8.0</span>\bin\mysqld.exe: Shutdown complete (mysqld <span class="number">8.0</span>.<span class="number">22</span>) MySQL Community Server - GPL.</span><br></pre></td></tr></table></figure></p>
<p>下面就对这个错误进行处理哦!</p>
<ul>
<li>首先执行 <code>mysqld --initialize --user=mysql --console</code></li>
<li>执行成功后执行<code>mysqld -install</code> 会提示<code>Service successfully installed.</code></li>
<li>重新执行 <code>mysqld --console --skip-grant-tables --shared-memory</code> 即可。<br>这时候当前这个命令行就不可以使用了。<h2 id="使用管理员权限在重新开一个命令行"><a href="#使用管理员权限在重新开一个命令行" class="headerlink" title="使用管理员权限在重新开一个命令行"></a>使用管理员权限在重新开一个命令行</h2>进入到Mysql的安装目录执行<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PS C:\Program Files\MySQL\MySQL Server <span class="number">8.0</span>\bin> mysql</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>这时候,就能成功的登录到mysql里面,我们来测试一下,是不是登录成功了</p>
<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">mysql> show databases;</span><br><span class="line">+--------------------+</span><br><span class="line">| Database |</span><br><span class="line">+--------------------+</span><br><span class="line">| information_schema |</span><br><span class="line">| mysql |</span><br><span class="line">| performance_schema |</span><br><span class="line">| sys |</span><br></pre></td></tr></table></figure>
<p>可以发现我们已经登录成功。<br>然后执行下面的语句<br><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mysql> use mysql;</span><br><span class="line">Database changed</span><br><span class="line">mysql> show tables;</span><br></pre></td></tr></table></figure></p>
<p>老的版本是执行<code>select user,host,password from user;</code> 但是会报错password是一个无效的字段。在mysql8.0中password已经被替代了<br>因此我们要执行<code>select user,host,authentication_string from user;</code><br>最后执行:<br><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">UPDATE mysql.user SET authentication_string=<span class="string">''</span> WHERE user=<span class="string">'root'</span> and host=<span class="string">'localhost'</span>;</span><br></pre></td></tr></table></figure></p>
<h2 id="关闭两个CMD-重启mysql"><a href="#关闭两个CMD-重启mysql" class="headerlink" title="关闭两个CMD 重启mysql"></a>关闭两个CMD 重启mysql</h2><p>我们关闭刚刚打开的两个管理员登录的cmd,然后在重新使用管理员权限打开一个cmd,输入</p>
<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">PS C:\Windows\system32> net start mysql</span><br><span class="line">MySQL 服务正在启动 .</span><br><span class="line">MySQL 服务已经启动成功。</span><br></pre></td></tr></table></figure>
<p>启动成功之后,输入</p>
<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PS C:\Windows\system32> mysql -u root</span><br></pre></td></tr></table></figure>
<p>这时候,我们就进入到了mysql的界面了,在输入</p>
<figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mysql> ALTER USER <span class="string">'root'</span><span class="string">@'localhost' IDENTIFIED BY 'root';</span></span><br><span class="line"><span class="string">Query OK, 0 rows affected (0.01 sec)</span></span><br></pre></td></tr></table></figure>
<p>这里的root 是我设置的测试用户名与密码,要根据自己的自行调整。</p>
<h2 id="使用普通用户权限打开cmd"><a href="#使用普通用户权限打开cmd" class="headerlink" title="使用普通用户权限打开cmd"></a>使用普通用户权限打开cmd</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\ouc>mysql -uroot -p</span><br></pre></td></tr></table></figure>
<p>这样我们就可以使用新的密码成功的登录数据库了!</p>
<h2 id="这里还是要提醒大家,尽量建立一个密码本,可以将密码都记录下来,这样就不用整天这么麻烦的因为这种小事情,捣鼓啦"><a href="#这里还是要提醒大家,尽量建立一个密码本,可以将密码都记录下来,这样就不用整天这么麻烦的因为这种小事情,捣鼓啦" class="headerlink" title="这里还是要提醒大家,尽量建立一个密码本,可以将密码都记录下来,这样就不用整天这么麻烦的因为这种小事情,捣鼓啦"></a>这里还是要提醒大家,尽量建立一个密码本,可以将密码都记录下来,这样就不用整天这么麻烦的因为这种小事情,捣鼓啦</h2>
</div>
<div class="article-info article-info-index">
<div class="counter-tag counter">
<span id="/2021/02/05/Win10 系统MySQL8.0 忘记管理员密码,重新设置新的密码/" class="leancloud_visitors post-title-link" style="font-size: 12px" data-flag-title="Win10 系统MySQL8.0 忘记管理员密码,重新设置新的密码">
view
</span>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-Maven" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/01/23/Maven/" class="article-date">
<time datetime="2021-01-23T05:06:00.020Z" itemprop="datePublished">2021-01-23</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/01/23/Maven/">
Maven
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>Maven的主要作用是进行项目管理以及统一维护jar包</p>
<h3 id="Maven的管理的项目需要有着相同的项目结构"><a href="#Maven的管理的项目需要有着相同的项目结构" class="headerlink" title="Maven的管理的项目需要有着相同的项目结构"></a>Maven的管理的项目需要有着相同的项目结构</h3><ul>
<li>有一个pom.xml 用于维护当前项目都使用了哪些jar包</li>
<li>所有的java代码都放在src/main/java的下面</li>
<li>所用的测试代码都放在src/test/java的下面</li>
</ul>
<h3 id="统一维护jar包"><a href="#统一维护jar包" class="headerlink" title="统一维护jar包"></a>统一维护jar包</h3><p>如果含有不同的项目,这三个项目的结构都不是maven的风格,就会各自维护一套jar包,而这些jar包是相同的,而maven的项目,会把这些jar包都放在“仓库”里面,然后哪个项目需要用到哪个jar包,就只需要给出jar包的名称还有版本号。</p>
<h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>现在maven的最新版本为3.8.3这一版本,下载binary的这一个zip文件就可以了。Mac下 需要下载apache-maven-xxxx-bin.tar.gz 这个文件<br>(在使用mac 配置的时候,注意环境变量 export v=/Users 等号之间不能留有空格)</p>
<h2 id="仓库"><a href="#仓库" class="headerlink" title="仓库"></a>仓库</h2><p>所谓的仓库就是用于存放项目需要的jar包的。maven采用的是一个仓库,多个项目,多个项目共享一个仓库。</p>
<h3 id="仓库默认的位置"><a href="#仓库默认的位置" class="headerlink" title="仓库默认的位置"></a>仓库默认的位置</h3><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><!-- localRepository</span><br><span class="line"> | The path to the local repository maven will use to store artifacts.</span><br><span class="line"> |</span><br><span class="line"> | Default: ${user.home}/.m2/repository</span><br><span class="line"> <localRepository>/path/to/local/repo</localRepository></span><br></pre></td></tr></table></figure>
<h3 id="修改仓库默认的保存位置"><a href="#修改仓库默认的保存位置" class="headerlink" title="修改仓库默认的保存位置"></a>修改仓库默认的保存位置</h3><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><localRepository>Users/gorge/java_jar</localRepository></span><br></pre></td></tr></table></figure>
<h3 id="修改默认的下载路径"><a href="#修改默认的下载路径" class="headerlink" title="修改默认的下载路径"></a>修改默认的下载路径</h3><p>maven 会默认从maven官方提供的服务器下载jar包。<br>而官方服务器在国外,所以下载起来会比较慢,而且不稳定。<br>所以我们将下载路径设置为阿里云的。<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><mirror></span><br><span class="line"> <id>alimaven</id></span><br><span class="line"> <mirrorOf>central</mirrorOf></span><br><span class="line"> <name>aliyun maven</name></span><br><span class="line"> <url>http:<span class="comment">//maven.aliyun.com/nexus/content/repositories/central/</url></span></span><br><span class="line"> </mirror></span><br></pre></td></tr></table></figure></p>
<h2 id="Eclipse上配置Maven"><a href="#Eclipse上配置Maven" class="headerlink" title="Eclipse上配置Maven"></a>Eclipse上配置Maven</h2><p>Mac版本的为: Eclipse ->Preferences<br>然后<br><img src="https://img-blog.csdnimg.cn/20210122210715161.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"><br>然后点击Add -> Directory (这个为对应的maven的安装路径)<br>将已经安装好的maven添加进去就可以啦!</p>
<h3 id="设置仓库路径"><a href="#设置仓库路径" class="headerlink" title="设置仓库路径"></a>设置仓库路径</h3><p>这里我们要选择上面图中的User Setting 这个选项<br>,配置Global Settings 和 User Settings都使用我们上面的配置文件<br>然后在点击一下Reindex ,这个按钮确保我们的Local Repository 的配置为我们上面配置的仓库默认的保存位置 Users/gorge/java_jar</p>
<h3 id="接下来在Eclipse中创建一个Maven的项目就可以了"><a href="#接下来在Eclipse中创建一个Maven的项目就可以了" class="headerlink" title="接下来在Eclipse中创建一个Maven的项目就可以了"></a>接下来在Eclipse中创建一个Maven的项目就可以了</h3><h2 id="Maven添加包"><a href="#Maven添加包" class="headerlink" title="Maven添加包"></a>Maven添加包</h2><p>在Maven项目中找到pom.xml 文件,然后在jar包网站上<a href="https://mvnrepository.com" target="_blank" rel="noopener">jar包</a> 找到自己要添加的jar包<br><img src="https://img-blog.csdnimg.cn/20210123104852696.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"><br>将这个dependency添加到pom.xml文件的dependencies 中就可以啦!!记得点击保存。</p>
<h2 id="Eclipse上创建java-web项目"><a href="#Eclipse上创建java-web项目" class="headerlink" title="Eclipse上创建java web项目"></a>Eclipse上创建java web项目</h2><p><img src="https://img-blog.csdnimg.cn/20210123110005390.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTM2NzE2,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"><br>与前面创建java se项目不同的地方在于,这一步的时候我们要选择<strong><em>maven-archetype-webapp</em></strong>这个选项。<br>此时能得到的maven web 项目,不过有两个问题</p>
<ol>
<li>没有java源代码目录</li>
<li>index.jsp报错<h4 id="创建java-源代码目录"><a href="#创建java-源代码目录" class="headerlink" title="创建java 源代码目录"></a>创建java 源代码目录</h4>在上一步的截图中可以发现,没有地方存放java源文件,这个时候就需要按照如下步骤做:<br>右键项目->属性->Java Build Path->Libraries->选中JRE System Library->Edit->Workspace default JRE(jdk8)->Finish 就可以了</li>
</ol>
<h4 id="index-jsp-报错"><a href="#index-jsp-报错" class="headerlink" title="index.jsp 报错"></a>index.jsp 报错</h4><p>这个报错 的原因是因为缺少servlet.jar包的支持,我们只需要按照上面导入jar包的步骤进行导入就可以了。</p>
<h2 id="将项目部署到tomcat上面"><a href="#将项目部署到tomcat上面" class="headerlink" title="将项目部署到tomcat上面"></a>将项目部署到tomcat上面</h2><p>与java web项目的操作是一样的,直接在项目上进行右键点击,然后Run As -> Run on Server 就可以了!</p>
<h2 id="Maven的父子项目"><a href="#Maven的父子项目" class="headerlink" title="Maven的父子项目"></a>Maven的父子项目</h2><p>通过 maven 可以创建父子-聚合项目。 所谓的父子项目,即有一个父项目,有多个子项目。<br>这些子项目,在业务逻辑上,都归纳在这个父项目下,并且一般来说,都会有重复的jar包共享。<br>所以常用的做法会把重复的 jar 包都放在父项目下进行依赖,那么子项目就无需再去依赖这些重复的 jar 包了。</p>
<h4 id="首先,我们要先按照上述流程创建一个Maven-Project-项目,这个项目是作为父项目的。"><a href="#首先,我们要先按照上述流程创建一个Maven-Project-项目,这个项目是作为父项目的。" class="headerlink" title="首先,我们要先按照上述流程创建一个Maven Project 项目,这个项目是作为父项目的。"></a>首先,我们要先按照上述流程创建一个Maven Project 项目,这个项目是作为父项目的。</h4><h4 id="然后修改配置文件"><a href="#然后修改配置文件" class="headerlink" title="然后修改配置文件"></a>然后修改配置文件</h4><p>主要是修改两部分的配置文件</p>
<ul>
<li>修改默认包</li>
</ul>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">这里默认的是jar,我们应该修改为pom,这样才可以作为父项目存在</span><br><span class="line"><packaging>pom</packaging></span><br></pre></td></tr></table></figure>
<ul>
<li>修改hutool jar 包的依赖,用于后来子项目里观察对其的调用<br>需要在depend ices 中添加如下代码<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><dependency></span><br><span class="line"> <groupId>cn.hutool</groupId></span><br><span class="line"> <artifactId>hutool-all</artifactId></span><br><span class="line"> <version>4.3.1</version></span><br><span class="line"> </dependency></span><br></pre></td></tr></table></figure>
</li>
</ul>
<p><strong><em>修改 pom.xml 之后, 右键点击项目 -> Maven -> Update Project -> OK 进行更新。 否则项目会有红点~</em></strong></p>
<h4 id="创建子项目"><a href="#创建子项目" class="headerlink" title="创建子项目"></a>创建子项目</h4><p>接下来创建maven 子项目。 maven 子项目有叫做模块 module.<br>为了能够在 parentMavenProject 的基础上创建其子项目,首先右键点击 parentMavenProject, 然后点击 New -> Other -> Maven -Maven Module -> Next</p>
<h4 id="子项目的pom-xml"><a href="#子项目的pom-xml" class="headerlink" title="子项目的pom.xml"></a>子项目的pom.xml</h4><p>可以看到其中有如下parent<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><parent></span><br><span class="line"> <groupId>cn.how2j</groupId></span><br><span class="line"> <artifactId>parentMavenProject</artifactId></span><br><span class="line"> <version>0.0.1-SNAPSHOT</version></span><br><span class="line"> </parent></span><br></pre></td></tr></table></figure></p>
<h4 id="父项目的pom-xml"><a href="#父项目的pom-xml" class="headerlink" title="父项目的pom.xml"></a>父项目的pom.xml</h4><p>再次打开父项目的pom.xml, 会发现其多了一个</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><modules></span><br><span class="line"> <module>childMavenProject</module></span><br><span class="line"></modules></span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<div class="counter-tag counter">
<span id="/2021/01/23/Maven/" class="leancloud_visitors post-title-link" style="font-size: 12px" data-flag-title="Maven">
view
</span>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-泛型总结与补充" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2021/01/21/泛型总结与补充/" class="article-date">
<time datetime="2021-01-21T07:04:43.630Z" itemprop="datePublished">2021-01-21</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2021/01/21/泛型总结与补充/">
泛型总结与补充
</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>当把对象放进java集合中的时候,集合就会忘记这个对象的数据类型,从而保证了通用性,但是也产生了一些问题。<br>对于java集合,在编译的时候是不检查类型的,因此取出集合的时候是需要进行强制类型转换的,可能会引发ClassCastException异常。JDK5之后,发展起来的。</p>
<p><strong><em>所谓泛型就是在定义类、接口、方法的时候使用类型形参,这个类型形参将在声明变量、创建对象、调用方法的时候使用类型形参,这个类型形参将在声明变量、创建对象、调用方法的时候动态的指定(即传入实际的类型参数、可以称为类型实参)。</em></strong></p>
<h2 id="更新"><a href="#更新" class="headerlink" title="更新"></a>更新</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ArrayList<String> s = <span class="keyword">new</span> ArrayList<String>();</span><br><span class="line"><span class="comment">//JDK7之前是不支持的</span></span><br><span class="line">ArrayList<String> s = <span class="keyword">new</span> ArrayList<>();</span><br></pre></td></tr></table></figure>
<ul>
<li>泛型的实质是:允许在定义接口、类时声明类型形参,类型形参在整个接口、类体内可当成类型使用。几乎所有可使用普通类型的地方都可以使用这种类型形参。</li>
<li>类名中添加了泛型之后,在写类的构造器的时候,不需要添加</li>
<li>泛型具有继承性</li>
<li>不管泛型的实际类型参数是什么,他们在运行的时候总有同样的类.在内存中也只占用一块内存,因此在静态方法,静态代码块,静态变量的声明过程中,都不允许使用类型形参。</li>
</ul>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ArrayList<String> s = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> ArrayList<Integer> s2 = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> System.out.println(s.getClass()==s2.getClass()); <span class="comment">//true</span></span><br></pre></td></tr></table></figure>
<ul>
<li>由于系统中并不会真正的生成泛型类,所以instanceof 运算符后不能使用泛型类<h2 id="使用类型通配符"><a href="#使用类型通配符" class="headerlink" title="使用类型通配符"></a>使用类型通配符</h2>为了表示各种类型List的父类,我们使用类型统配符,类型统配符是一个问号(?),将一个问号作为类型实参传给List集合,写作:List<?> (意思是未知类型元素的List)。这个问号(?)被称为统配符,它的元素类型可以匹配任何类型。</li>
</ul>
<p>下面这个程序中使用的时候需要注意,</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ArrayList<?> s = <span class="keyword">new</span> ArrayList<String>();</span><br><span class="line"> s.add(<span class="keyword">new</span> Object());</span><br><span class="line"><span class="comment">// 这样写会出错的</span></span><br></pre></td></tr></table></figure>
<p>因为,add方法是有类型参数E作为集合的元素类型,所以传递给add的参数必须是E类的对象或者子类,但是添加null是可以的,因为null是所有引用类型的实例。<br>如果调用get方法是可以的,其返回值是一个未知类型,但是可以肯定的是它总是一个Object。</p>
<h2 id="类型通配符的上限"><a href="#类型通配符的上限" class="headerlink" title="类型通配符的上限"></a>类型通配符的上限</h2><p>如果我们不想List<?>是所有类型的父亲类,只想表示它是某一类泛型List的父类。可以使用下面例子</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// shape是 一个抽象类 ,那么list中就可以使用继承自shape的类</span></span><br><span class="line">List<? extends Shape></span><br></pre></td></tr></table></figure>
<p>因为我们不知道这个受限制通配符的具体类型,因此,我们也不能将Shape类的子类添加到List中。</p>
<h2 id="设定类型形参的上限"><a href="#设定类型形参的上限" class="headerlink" title="设定类型形参的上限"></a>设定类型形参的上限</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Number 是List 类型形参的上限</span></span><br><span class="line">List<T extends Number></span><br></pre></td></tr></table></figure>
<h2 id="泛型方法"><a href="#泛型方法" class="headerlink" title="泛型方法"></a>泛型方法</h2><p>我们在定义方法的时候,可以使用类型形参,所谓的泛型方法就是在声明方法的时候定义一个或多个类型形参。使用格式如下:<br><strong>修饰符 <T,S> 返回值类型 方法名(形参列表 ){<br>//方法体<br>}</strong><br>多个形参类型之间以逗号隔开,所有的类型形参声明放在方法修饰和方法返回值类型之间</p>
<p>例如:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">static</span> <T> <span class="function"><span class="keyword">void</span> <span class="title">fromArrayTocollection</span><span class="params">(T[] a,Collection<T> c)</span></span>{</span><br><span class="line"><span class="keyword">for</span>(T O : a){</span><br><span class="line"> c.add(o)</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>使用示例:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Generical</span> </span>{</span><br><span class="line"> <span class="keyword">static</span> <T> <span class="function"><span class="keyword">void</span> <span class="title">addArray</span><span class="params">(T[] a,Collection <T> c)</span> </span>{</span><br><span class="line"> <span class="keyword">for</span>(T o:a) {</span><br><span class="line"> c.add(o);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span> </span>{</span><br><span class="line"> Object [] oa = <span class="keyword">new</span> Object[<span class="number">10</span>];</span><br><span class="line"> Collection <Object> coll = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> addArray(oa,coll);</span><br><span class="line"> String [] ss = <span class="keyword">new</span> String[<span class="number">3</span>];</span><br><span class="line"> Collection<String> coll2 = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> addArray(ss,coll2);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>方法声明的形参只能在该方法里面使用,而接口、类声明中定义的类型形参则可以在整个接口以及类中使用。</p>
<h3 id="泛型方法和类型统配符的区别"><a href="#泛型方法和类型统配符的区别" class="headerlink" title="泛型方法和类型统配符的区别"></a>泛型方法和类型统配符的区别</h3><p>大多数时候都可以使用泛型方法来代替类型统配符。例如:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">boolean</span> <span class="title">containAll</span><span class="params">(Collection<?> c)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">boolean</span> <span class="title">addAll</span><span class="params">(Collection<? extends E> c)</span></span></span><br><span class="line"><span class="function">可以 替换成 </span></span><br><span class="line"><span class="function"><T> <span class="keyword">boolean</span> <span class="title">containAll</span><span class="params">(Collection<T> c)</span></span>;</span><br><span class="line"><T extends E> <span class="function"><span class="keyword">boolean</span> <span class="title">addAll</span><span class="params">(Collection<T> c)</span></span></span><br></pre></td></tr></table></figure>
<p>上面两个方法中类型形参T只使用了一次,类型形参T使用的产生的唯一效果是可以在不同的调用点传入不同的实际类型。类型统配符就是被设计用来支持灵活的子类化的。<br>泛型方法允许类型形参被用来表示方法的一个或多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系,如果没有依赖关系就不要使用泛型。</p>
<h3 id="泛型构造器"><a href="#泛型构造器" class="headerlink" title="泛型构造器"></a>泛型构造器</h3><p>Java 允许在构造器签名中声明类型形参。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Foo</span> </span>{</span><br><span class="line"> <span class="keyword">public</span> <T> Foo(T t){</span><br><span class="line"> System.out.println(t);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//测试</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span> </span>{</span><br><span class="line"> <span class="keyword">new</span> Foo(<span class="string">"CEHSI"</span>);</span><br><span class="line"> <span class="keyword">new</span> Foo(<span class="number">20</span>);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h3 id="Java7新增加的“菱形”"><a href="#Java7新增加的“菱形”" class="headerlink" title="Java7新增加的“菱形”"></a>Java7新增加的“菱形”</h3><p>前面介绍的Java7新增“菱形”语法,它允许调用构造器时在构造器后使用一对尖括号来代表泛型信息。但如果程序显示指定了泛型构造器中声明的类型形参的实际类型,则不可以使用“菱形”语法。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Foo</span><<span class="title">E</span>> </span>{</span><br><span class="line"> <span class="keyword">public</span> <T> Foo(T t){</span><br><span class="line"> System.out.println(t);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Generical</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span> </span>{</span><br><span class="line"> Foo<String> mc1 = <span class="keyword">new</span> Foo<>(<span class="number">5</span>);</span><br><span class="line"> Foo<String> mc2 = <span class="keyword">new</span> <Integer>Foo<String>(<span class="number">5</span>);</span><br><span class="line"> <span class="comment">//编译会错误 因为即指定了泛型构造器中的类型形参是Integter类型,又想使用“菱形”语法</span></span><br><span class="line"> Foo<String> mc3 = <span class="keyword">new</span> <Integer>Foo<>(<span class="number">5</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="设定统配符下限"><a href="#设定统配符下限" class="headerlink" title="设定统配符下限"></a>设定统配符下限</h3><p>为了表达A元素与B元素相同或者是B元素的父类,这种约束关系,java允许设定统配符的下限<? super Type> 这个统配符表示它必须是Type本身或者是Type 的父类。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <T> <span class="function">T <span class="title">copy</span><span class="params">(Collection<? <span class="keyword">super</span> T> dest,Collection<T> src)</span> </span>{</span><br><span class="line"> T last = <span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">for</span>(T ele : src) {</span><br><span class="line"> last = ele;</span><br><span class="line"> dest.add(ele);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> last;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String [] args)</span> </span>{</span><br><span class="line"> List<Number> ln = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> List<Integer> li = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> li.add(<span class="number">5</span>);</span><br><span class="line"> Integer d = copy(ln,li);</span><br><span class="line"> System.out.println(d);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="泛型方法与方法重载"><a href="#泛型方法与方法重载" class="headerlink" title="泛型方法与方法重载"></a>泛型方法与方法重载</h4><p>因为泛型既可以允许设定统配符的上限,也允许设定统配符的下限,但是在Jdk-1.8 之后就不支持。这里的jdk1.8是我现在使用的版本。在jdk1.8之前具体到哪一个版本,没有测试。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <T> <span class="function"><span class="keyword">void</span> <span class="title">copy</span><span class="params">(Collection<T> dest,Collection<? extends T> src)</span> </span>{</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> <span class="function">T <span class="title">copy</span><span class="params">(Collection<? <span class="keyword">super</span> T> dest,Collection<T> src)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="擦除和转换"><a href="#擦除和转换" class="headerlink" title="擦除和转换"></a>擦除和转换</h4><p>在严格的泛型代码里面,带泛型声明的类总应该带着类型参数。但是为了与老的JAVA代码保持一致,也允许在使用带泛型声明的类时不指定实际的类型参数。如果没有为这个泛型类指定实际的类型参数,则该类型参数被称作是原始类型,默认是声明该参数的第一个上限类型。</p>
<p>当把一个具有泛型信息的对象赋值给另一个没有泛型信息的变量的时候,所有在尖括号之间的类型信息都将会被扔掉。<br>例如:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Apple</span> <<span class="title">T</span> <span class="keyword">extends</span> <span class="title">Number</span>></span>{</span><br><span class="line">T size;</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">Apple</span><span class="params">()</span> </span>{}</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">Apple</span><span class="params">(T size)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.size = size;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setSize</span><span class="params">(T size)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.size = size;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">public</span> T <span class="title">getSize</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">this</span>.size;</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Apple<Integer> a = <span class="keyword">new</span> Apple<>(<span class="number">6</span>);</span><br><span class="line"><span class="comment">//a 的getsize方法返回Integer</span></span><br><span class="line">Integer as = a.getSize();</span><br><span class="line"><span class="comment">//把a 的对象赋值给Apple变量,丢失尖括号里面的里类型信息</span></span><br><span class="line">Apple b = a;</span><br><span class="line"><span class="comment">//b 只能知道size的类型是Number</span></span><br><span class="line">Number size1 = b.getSize();</span><br><span class="line"><span class="comment">//Integer size2 = b.getSize();</span></span><br></pre></td></tr></table></figure>
<p>可以看到上面的一个示例,我们首先创建了一个Apple的类,是带有泛型声明为Integer的,其类型的上限是Number,这个类型形参用来定义Apple类的size变量,然后又创建了一个Apple的类,该类是没有泛型的,当我们把带有泛型信息的a对象的泛型信息赋值给不带有泛型信息的b对象的时候,即所有尖括号里面的信息都会丢失—–因为Apple 的类型形参的上限是Number类,编译器依然知道b的getsize()方法返回的是Number类型,但是具体是哪一个就不清楚了。</p>
<p><em>当我们将一个有着泛型类型的类a,赋值给没有泛型类型的类b的时候,就会出现丢失类的变量类型信息的现象,称为擦除。</em></p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Apple<Integer> a = <span class="keyword">new</span> Apple<>(<span class="number">6</span>);</span><br><span class="line"><span class="comment">//a 的getsize方法返回Integer</span></span><br><span class="line">Integer as = a.getSize();</span><br><span class="line"><span class="comment">//把a 的对象赋值给Apple变量,丢失尖括号里面的里类型信息</span></span><br><span class="line">Apple b = a;</span><br><span class="line"><span class="comment">//b 只能知道size的类型是Number</span></span><br><span class="line">Number size1 = b.getSize();</span><br><span class="line">Apple<Double> c = b;</span><br><span class="line">Double size2 = (Double)c.getSize();</span><br></pre></td></tr></table></figure>
<p>我们在将没有泛型类型的类b,赋值给一个带有泛型类型的类c,这时候是可以编译通过的,只是会出现“未经检查的转换”警告。实际上引用的还是Apple<integer>的这个类型,当我们尝试通过强制转换把它转换成一个Double的类型的时候,就会出现运行时异常<strong><em>java.lang.ClassCastException</em></strong></integer></p>
<h4 id="泛型与数组"><a href="#泛型与数组" class="headerlink" title="泛型与数组"></a>泛型与数组</h4><p>java5的泛型有一个很重要的设计原则,如果一段代码在编译的时候没有提出“[unchecked]”未经检验的异常的时候,那么程序在运行的时候是不会引发ClassCastException的异常的。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//这种操作是错误的原因是 数组不能包含类型变量或者类型形参 </span></span><br><span class="line"> List<String> [] test = <span class="keyword">new</span> List<String>[<span class="number">10</span>];</span><br></pre></td></tr></table></figure></p>
<p>如果我们把上面的形式改为下面的格式,则为:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//这个在java 5 中在编译的时候会出现 [unchecked] 异常</span></span><br><span class="line"> List<String> [] test = <span class="keyword">new</span> List[<span class="number">10</span>];</span><br></pre></td></tr></table></figure>
<p>在java 7 中是允许出现这个情况的。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">List<String> [] test = <span class="keyword">new</span> ArrayList[<span class="number">10</span>];</span><br><span class="line">List<String> li = <span class="keyword">new</span> ArrayList<String>();</span><br><span class="line">li.add(<span class="string">"2"</span>);</span><br><span class="line">test[<span class="number">0</span>] = li;</span><br><span class="line">System.out.println(test[<span class="number">0</span>].get(<span class="number">0</span>));</span><br></pre></td></tr></table></figure></p>
<p>Java 8 允许使用无上限的泛型通配符,但是在Java 5中,如果使用无上限的泛型通配符是需要进行 强制类型转换的。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//java允许使用无上限的泛型统配符</span></span><br><span class="line">List<?> [] test = <span class="keyword">new</span> ArrayList<?>[<span class="number">10</span>];</span><br><span class="line">List<String> li = <span class="keyword">new</span> ArrayList<String>();</span><br><span class="line">li.add(<span class="string">"2"</span>);</span><br><span class="line">List<Integer> li2 = <span class="keyword">new</span> ArrayList<Integer>();</span><br><span class="line">li2.add(<span class="number">3</span>);</span><br><span class="line">test[<span class="number">0</span>] = li;</span><br><span class="line">test[<span class="number">1</span>] = li2;</span><br><span class="line">System.out.println(test[<span class="number">0</span>].get(<span class="number">0</span>));</span><br><span class="line">System.out.println(test[<span class="number">1</span>].get(<span class="number">0</span>));</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
</div>
<div class="article-info article-info-index">