2015中國國際電動車、電池技術展示交易會圓滿閉幕

2015中國(北京)國際電動車技術展示交易會、第十二屆中國國際電池產品及原輔材料、零配件、機械設備展示交易會於2015年6月5日在北京中國國際展覽中心(老館)圓滿閉幕。自1997年以來,北京華興東方展覽有限公司在北京已經成功舉辦了十二屆國際電池展示交易會,已成為中國乃至亞太地區最重要、規模最大的電池專業展。

儘管天氣比較炎熱,但絲毫沒有影響到參觀者的熱情。無論是規模、檔次、展商參展規格、媒體報導密度還是觀眾參與熱情都創新高。不僅吸引了新能源汽車產業鏈相關行業的極大關注,也進一步推動了國際間、企業間、政企之間的廣泛合作交流,共同擴大了新能源汽車企業品牌的影響力和競爭力。

陣容強大  涵蓋新能源全產業鏈

Battery China 2015/EVTec China 2015展覽面積30,000平方米,1500個展位,彙集300多家國內外知名企業參展。參展商來自中國大陸、中國香港、中國臺灣、韓國、美國、日本、德國、瑞士、比利時、英國、加拿大、瑞典等30多個國家和地區,除此之外,中國自主品牌的新能源汽車成為本屆展會的一大亮點。一汽集團、比亞迪、江淮、騰勢、奇瑞、東風日產、上汽、宇通等全力參展,以嶄新的姿態展示了各車型的技術亮點、出色的外觀和自主品牌創新力量的崛起;同時,優科新能源、首鋼機電、琥珀新能源、飛宏科技、BESK、Torjan、JM Energy、台塑、雙登、天能、超微、波士頓、欣旺達、普萊德、神州巨電、河南鋰動、長虹、佳貝思、威星、中航鋰電、猛獅、錢江鋰電、天康、西門子、中茂電子、嘉拓、七星華創、鴻寶、滄州明珠、中平瀚博等眾多電池企業也向觀眾展示最新動態、最新技術、最新工藝、最新產品。

此次展會彙集行業內主流電動車整車和電池企業,展示範圍涵蓋新能源汽車及動力電池、儲能電池全產業鏈。同時,展臺前人氣爆棚,觀展者們圍著各個品牌電動車車型仔細詢問,現場不少觀眾紛紛預約試駕了電動車,體驗了電動車的完美操控性。此外,各廠家還通過視頻、車型展示、互動體驗方式,極大地豐富了觀眾參觀體驗,再度顯示了創新引領技術改變的前瞻理念。

本屆展會既是新產品、新技術的展示平臺,也是新能源汽車發展趨勢的風向標。充分展現了當今世界新能源汽車的最新成果和發展趨勢。隨著越來越多企業選擇“中國(北京)國際電動車技術展示交易會”,作為其新品發佈的戰略平臺,標誌著EVTec China 2015和 Battery China 2015已經成為具備國際影響力的一流展會,進一步推廣了綠色新能源汽車的環保發展理念。

專業交流  探究新能源合作發展

6月4日,主辦方還舉辦了中國電動車動力電池市場發展及技術論壇,來自行業領導、中外汽車及電池領域高管、專家學者以及KBIA、VDMA協會代表等200人出席了會議,共同探討新能源的發展路徑,並就節能減排、電動車及動力電池市場發展及技術最新趨勢、新能源汽車的推廣與普及,以及企業間的全球交流與合作進行了深入的研討和交流。除此之外,專家們在關注市場和前沿技術的同時,以最新的研究成果,分享了業內資訊與資源的共用,極大推動了國際間、企業間、政企間的交流合作。同時,觀眾們通過現場體驗及與專業人員的詳細交流也對新能源汽車有了更深入的認識和瞭解。

專業權威  樹立新能源產業推廣的新平臺

由北京華興東方展覽有限公司、中國北方車輛研究所國家863電動車重大專項動力電池測試中心、北京市新能源汽車發展促進中心、北京新能源汽車產業協會共同主辦的2015中國(北京)國際電動車技術展示交易會、第十二屆中國國際電池產品及原輔材料、零配件、機械設備展示交易會影響力凸顯,依託首都北京的政治和經濟優勢、便利的交通條件和完善的會展服務設施,成功打造了一場國際性新能源汽車產業鏈的展覽及交流平臺。

2017年,我們相約北京。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

python內置模塊collections介紹

目錄

python內置模塊collections介紹

collections是Python內建的一個集合模塊,提供了許多有用的集合類。

1、namedtuple

python提供了很多非常好用的基本類型,比如不可變類型tuple,我們可以輕鬆地用它來表示一個二元向量。

>>> v = (2,3) 

我們發現,雖然(2,3)表示出了一個向量的兩個坐標,但是,如果沒有額外說明,又很難直接看出這個元組是用來表示一個坐標的。

為此定義一個class又小題大做了,這時,namedtuple就派上用場了。

>>> from collections import namedtuple
>>> Vector = namedtuple('Vector', ['x', 'y'])
>>> v = Vector(2,3)
>>> v.x
2
>>> v.y
3

namedtuple是一個函數,它用來創建一個自定義的tuple對象,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素。

這樣一來,我們用namedtuple可以很方便地定義一種數據類型,它具備tuple的不變性,又可以根據屬性來引用,使用十分方便。

我們可以驗證創建的Vector對象的類型。

>>> type(v)
<class '__main__.Vector'>

>>> isinstance(v, Vector)
True

>>> isinstance(v, tuple)
True 

類似的,如果要用坐標和半徑表示一個圓,也可以用namedtuple定義:

>>> Circle = namedtuple('Circle', ['x', 'y', 'r'])
# namedtuple('名稱', [‘屬性列表’])

2、deque

在數據結構中,我們知道隊列和堆棧是兩個非常重要的數據類型,一個先進先出,一個後進先出。在python中,使用list存儲數據時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數據量大的時候,插入和刪除效率很低。

deque是為了高效實現插入和刪除操作的雙向鏈表結構,非常適合實現隊列和堆棧這樣的數據結構。

>>> from collections import deque
>>> deq = deque([1, 2, 3])
>>> deq.append(4)
>>> deq
deque([1, 2, 3, 4])
>>> deq.appendleft(5)
>>> deq
deque([5, 1, 2, 3, 4])
>>> deq.pop()
4
>>> deq.popleft()
5
>>> deq
deque([1, 2, 3])

deque除了實現list的append()和pop()外,還支持appendleft()和popleft(),這樣就可以非常高效地往頭部添加或刪除元素。

3、defaultdict

使用dict字典類型時,如果引用的key不存在,就會拋出KeyError。如果希望Key不存在時,返回一個默認值,就可以用defaultdict。

>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'defaultvalue')
>>> dd['key1'] = 'a'
>>> dd['key1']
'a'
>>> dd['key2'] # key2未定義,返回默認值
'defaultvalue'

注意默認值是調用函數返回的,而函數在創建defaultdict對象時傳入。

除了在Key不存在時返回默認值,defaultdict的其他行為跟dict是完全一樣的。

4、OrderedDict

使用dict時,key是無序的。在對dict做迭代時,我們無法確定key的順序。

但是如果想要保持key的順序,可以用OrderedDict。

>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是無序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

注意,OrderedDict的key會按照插入的順序排列,不是key本身排序

>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> list(od.keys()) # 按照插入的Key的順序返回
['z', 'y', 'x']

OrderedDict可以實現一個FIFO(先進先出)的dict,當容量超出限制時,先刪除最早添加的key。

from collections import OrderedDict

class LastUpdatedOrderedDict(OrderedDict):

    def __init__(self, capacity):
        super(LastUpdatedOrderedDict, self).__init__()
        self._capacity = capacity

    def __setitem__(self, key, value):
        containsKey = 1 if key in self else 0
        if len(self) - containsKey >= self._capacity:
            last = self.popitem(last=False)
            print('remove:', last)
        if containsKey:
            del self[key]
            print('set:', (key, value))
        else:
            print('add:', (key, value))
        OrderedDict.__setitem__(self, key, value)

5、ChainMap

ChainMap可以把一組dict串起來並組成一個邏輯上的dict。ChainMap本身也是一個dict,但是查找的時候,會按照順序在內部的dict依次查找。

什麼時候使用ChainMap最合適?舉個例子:應用程序往往都需要傳入參數,參數可以通過命令行傳入,可以通過環境變量傳入,還可以有默認參數。我們可以用ChainMap實現參數的優先級查找,即先查命令行參數,如果沒有傳入,再查環境變量,如果沒有,就使用默認參數。

下面的代碼演示了如何查找user和color這兩個參數。

from collections import ChainMap
import os, argparse

# 構造缺省參數:
defaults = {
    'color': 'red',
    'user': 'guest'
}

# 構造命令行參數:
parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = { k: v for k, v in vars(namespace).items() if v }

# 組合成ChainMap:
combined = ChainMap(command_line_args, os.environ, defaults)

# 打印參數:
print('color=%s' % combined['color'])
print('user=%s' % combined['user'])

沒有任何參數時,打印出默認參數:

$ python3 use_chainmap.py 
color=red
user=guest

當傳入命令行參數時,優先使用命令行參數:

$ python3 use_chainmap.py -u bob
color=red
user=bob

同時傳入命令行參數和環境變量,命令行參數的優先級較高:

$ user=admin color=green python3 use_chainmap.py -u bob
color=green
user=bob

6、Counter

Counter是一個簡單的計數器,例如,統計字符出現的個數:

from collections import Counter
>>> s = 'abbcccdddd'
>>> Counter(s)
Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})

Counter實際上也是dict的一個子類。

7、小結

collections模塊提供了一些有用的集合類,可以根據需要選用。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

海洋吸塵器完成首次任務 下一步:為垃圾再製品建立透明「價值鏈」

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

LG 化學獲長安汽車 PHEV 訂單 搶攻中國車用電池市場!

車用電池龍頭LG化學 (LG Chem) 將供應車用電池給中國當地汽車大廠長安汽車使用,LG化學從 2009 年就和長安汽車於電動車用電池相關技術進行合作,而在和中國國內電池廠經過激烈競爭之後,LG 化學將獨家供應電池給長安汽車預計於明年量產的次世代插電式油電混合車 (PHEV) 使用。   LG 化學正在江蘇省南京市興建一座年產能可達 10 萬台以上的電池工廠、並計畫於今年內完工,據 LG 化學電池事業本部長權英壽表示,在得到長安汽車的訂單之後,中國前 10 大車廠中、LG 化學已獲得長城汽車、東風汽車等半數車廠的訂單。   韓國時報 (Korea Times) 先前報導,LG Chem 積極布局中國電動車市場,在中國設廠拉客。該公司 5 月 17 日宣布和中國長城汽車 (Great Wall Motor) 簽約,將成為長城電動車的電池供應商,替 2017 年上市的新車供貨。LG Chem 目標是成為中國的車用電池霸主。  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

【集合系列】- 初探java集合框架圖

一、集合類簡介

Java集合就像一種容器,可以把多個對象(實際上是對象的引用,但習慣上都稱對象)“丟進”該容器中。從Java 5 增加了泛型以後,Java集合可以記住容器中對象的數據類型,使得編碼更加簡潔、健壯。

Java集合大致可以分為兩大體系,一個是Collection,另一個是Map

  • Collection :主要由List、Set、Queue接口組成,List代表有序、重複的集合;其中Set代表無序、不可重複的集合;Java 5 又增加了Queue體系集合,代表一種隊列集合實現。
  • Map:則代表具有映射關係的鍵值對集合。

java.util.Collection下的接口和繼承類關係簡易結構圖:

java.util.Map下的接口和繼承類關係簡易結構圖:

其中,Java 集合框架中主要封裝的是典型的數據結構和算法,如動態數組、雙向鏈表、隊列、棧、Set、Map 等。

將集合框架挖掘處理,可以分為以下幾個部分
1) 數據結構
List列表、Queue隊列、Deque雙端隊列、Set集合、Map映射
2) 比較器
Comparator比較器、Comparable排序接口
3) 算法
Collections常用算法類、Arrays靜態數組的排序、查找算法
4) 迭代器
Iterator通用迭代器、ListIterator針對 List 特化的迭代器

二、有序列表(List)

List集合的特點就是存取有序,可以存儲重複的元素,可以用下標進行元素的操作

List主要實現類:ArrayList、LinkedList、Vector、Stack。

2.1、ArrayList

ArrayList是一個動態數組結構,支持隨機存取,尾部插入刪除方便,內部插入刪除效率低(因為要移動數組元素);如果內部數組容量不足則自動擴容,因此當數組很大時,效率較低。

2.2、LinkedList

LinkedList是一個雙向鏈表結構,在任意位置插入刪除都很方便,但是不支持隨機取值,每次都只能從一端開始遍歷,直到找到查詢的對象,然後返回;不過,它不像 ArrayList 那樣需要進行內存拷貝,因此相對來說效率較高,但是因為存在額外的前驅和後繼節點指針,因此佔用的內存比 ArrayList 多一些。

2.3、Vector

Vector也是一個動態數組結構,一個元老級別的類,早在jdk1.1就引入進來類,之後在jdk1.2里引進ArrayList,ArrayList大部分的方法和Vector比較相似,兩者是不同的,Vector是允許同步訪問的,Vector中的操作是線程安全的,但是效率低,而ArrayList所有的操作都是異步的,執行效率高,但不安全!

關於Vector,現在用的很少了,因為裏面的getsetadd等方法都加了synchronized,所以,執行效率會比較低,如果需要在多線程中使用,可以採用下面語句創建ArrayList對象

List<Object> list =Collections.synchronizedList(new ArrayList<Object>());

也可以考慮使用複製容器 java.util.concurrent.CopyOnWriteArrayList進行操作,例如:

final CopyOnWriteArrayList<Object> cowList = new CopyOnWriteArrayList<String>(Object);

2.4、Stack

Stack是Vector的一個子類,本質也是一個動態數組結構,不同的是,它的數據結構是先進后出,取名叫棧!

關於Stack,現在用的也很少,因為有個ArrayDeque雙端隊列,可以替代Stack所有的功能,並且執行效率比它高!

三、集(Set)

Set集合的特點:元素不重複,存取無序,無下標;

Set主要實現類:HashSet、LinkedHashSet和TreeSet。

3.1、HashSet

HashSet底層是基於 HashMap 的k實現的,元素不可重複,特性同 HashMap。

3.2、LinkedHashSet

LinkedHashSet底層也是基於 LinkedHashMap 的k實現的,一樣元素不可重複,特性同 LinkedHashMap。

3.3、TreeSet

同樣的,TreeSet也是基於 TreeMap 的k實現的,同樣元素不可重複,特性同 TreeMap;

Set集合的實現,基本都是基於Map中的鍵做文章,使用Map中鍵不能重複、無序的特性;所以,我們只需要重點關注Map的實現即可!

四、隊列(Queue)

Queue是一個隊列集合,隊列通常是指“先進先出”(FIFO)的容器。新元素插入(offer)到隊列的尾部,訪問元素(poll)操作會返回隊列頭部的元素。通常,隊列不允許隨機訪問隊列中的元素。

Queue主要實現類:ArrayDeque、LinkedList、PriorityQueue。

4.1、ArrayDeque

ArrayQueue是一個基於數組實現的雙端隊列,可以想象,在隊列中存在兩個指針,一個指向頭部,一個指向尾部,因此它具有“FIFO隊列”及“棧”的方法特性。

既然是雙端隊列,那麼既可以先進先出,也可以先進后出,以下是測試例子!

先進先出

public static void main(String[] args) {
                ArrayDeque<String> queue = new ArrayDeque<>();
        //入隊
        queue.offer("AAA");
        queue.offer("BBB");
        queue.offer("CCC");
        System.out.println(queue);
        //獲取但不出隊
        System.out.println(queue.peek());
        System.out.println(queue);
        //出隊
        System.out.println(queue.poll());
        System.out.println(queue);
}

輸出結果:

[AAA, BBB, CCC]
AAA
[AAA, BBB, CCC]
AAA
[BBB, CCC]

先進后出

public static void main(String[] args) {
                ArrayDeque<String> stack = new ArrayDeque<>();
        //壓棧,此時AAA在最下,CCC在最外
        stack.push("AAA");
        stack.push("BBB");
        stack.push("CCC");
        System.out.println(stack);
        //獲取最後添加的元素,但不刪除
        System.out.println(stack.peek());
        System.out.println(stack);
        //彈出最後添加的元素
        System.out.println(stack.pop());
        System.out.println(stack);
}

輸出結果:

[CCC, BBB, AAA]
CCC
[CCC, BBB, AAA]
CCC
[BBB, AAA]

4.2、LinkedList

LinkedList是List接口的實現類,也是Deque的實現類,底層是一種雙向鏈表的數據結構,在上面咱們也有所介紹,LinkedList可以根據索引來獲取元素,增加或刪除元素的效率較高,如果查找的話需要遍歷整合集合,效率較低,LinkedList同時實現了stack、Queue、PriorityQueue的所有功能。

例子

public static void main(String[] args) {
                LinkedList<String> ll = new LinkedList<>();
        //入隊
        ll.offer("AAA");
        //壓棧
        ll.push("BBB");
        //雙端的另一端入隊
        ll.addFirst("NNN");
        ll.forEach(str -> System.out.println("遍歷中:" + str));
        //獲取隊頭
        System.out.println(ll.peekFirst());
        //獲取隊尾
        System.out.println(ll.peekLast());
        //彈棧
        System.out.println(ll.pop());
        System.out.println(ll);
        //雙端的後端出列
        System.out.println(ll.pollLast());
        System.out.println(ll);
}

輸出結果:

遍歷中:NNN
遍歷中:BBB
遍歷中:AAA
NNN
AAA
NNN
[BBB, AAA]
AAA
[BBB]

4.3、PriorityQueue

PriorityQueue也是一個隊列的實現類,此實現類中存儲的元素排列並不是按照元素添加的順序進行排列,而是內部會按元素的大小順序進行排列,是一種能夠自動排序的隊列。

例子

public static void main(String[] args) {
        PriorityQueue<Integer> queue1 = new PriorityQueue<>(10);

        System.out.println("處理前的數據");
        Random rand = new Random();
        for (int i = 0; i < 10; i++) {
                Integer num = rand.nextInt(90) + 10;
                System.out.print(num + ", ");
            queue1.offer(num); // 隨機兩位數
        }

        System.out.println("\n處理后的數據");
        for (int i = 0; i < 10; i++) { // 默認是自然排序 [升序]
            System.out.print(queue1.poll() + ", ");
        }
}

輸出結果:

處理前的數據
36, 23, 24, 11, 12, 26, 79, 96, 14, 73, 
處理后的數據
11, 12, 14, 23, 24, 26, 36, 73, 79, 96, 

五、映射表(Map)

Map是一個雙列集合,其中保存的是鍵值對,鍵要求保持唯一性,值可以重複。

Map 主要實現類:HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties。

5.1、HashMap

關於HashMap,相信大家都不陌生,繼承自AbstractMap,key 不可重複,因為使用的是哈希表存儲元素,所以輸入的數據與輸出的數據,順序基本不一致,另外,HashMap最多只允許一條記錄的 key 為 null。

5.2、LinkedHashMap

HashMap 的子類,內部使用鏈表數據結構來記錄插入的順序,使得輸入的記錄順序和輸出的記錄順序是相同的。LinkedHashMap與HashMap最大的不同處在於,LinkedHashMap輸入的記錄和輸出的記錄順序是相同的!

5.3、TreeMap

能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用 Iterator 遍歷時,得到的記錄是排過序的;如需使用排序的映射,建議使用 TreeMap。TreeMap實際使用的比較少!

5.4、IdentityHashMap

繼承自AbstractMap,與HashMap有些不同,在獲取元素的時候,通過==代替equals ()來進行判斷,比較的是內存地址

get方法源碼部分

public V get(Object key) {
        Object k = maskNull(key);
        Object[] tab = table;
        int len = tab.length;
        int i = hash(k, len);
        while (true) {
            Object item = tab[i];
            //用==比較k和元素是否相等
            if (item == k)
                return (V) tab[i + 1];
            if (item == null)
                return null;
            i = nextKeyIndex(i, len);
        }
}

5.5、WeakHashMap

WeakHashMap繼承自AbstractMap,被稱為緩存Map,向WeakHashMap中添加元素,再次通過鍵調用方法獲取元素方法時,不一定獲取到元素值,因為WeakHashMap 中的 Entry 可能隨時被 GC 回收。

5.6、Hashtable

Hashtable,一個元老級的類,鍵值不能為空,與HashMap不同的是,方法都加了synchronized同步鎖,是線程安全的,但是效率上,沒有HashMap快!

同時,HashMap 是 HashTable 的輕量級實現,他們都完成了Map 接口,區別在於 HashMap 允許K和V為空,而HashTable不允許K和V為空,由於非線程安全,效率上可能高於 Hashtable。

如果需要在多線程環境下使用HashMap,可以使用如下的同步器來實現或者使用併發工具包中的ConcurrentHashMap

Map<String, Object> map =Collections.synchronizedMap(new HashMap<>());

5.7、Properties

Properties繼承自HashTable,Properties新增了load()和和store()方法,可以直接導入或者將映射寫入文件,另外,Properties的鍵和值都是String類型。

六、比較器

Comparable和Comparator接口都是用來比較大小的,一般在TreeSet、TreeMap接口中使用的比較多,主要用於解決排序問題。

6.1、Comparable

Comparable:對實現它的每個類的對象進行整體排序

package java.lang;
import java.util.*;

public interface Comparable<T> {
    public int compareTo(T o);
}

若一個類實現了Comparable 接口,實現 Comparable 接口的類的對象的 List 列表 ( 或數組)可以通過 Collections.sort(或 Arrays.sort)進行排序。

此外,實現 Comparable 接口的類的對象 可以用作 “有序映射 ( 如 TreeMap)” 中的鍵或 “有序集合 (TreeSet)” 中的元素,而不需要指定比較器。

使用例子:

/**
  * 實體類Person實現Comparable接口
  */
public class Person implements Comparable<Person>{
    private int age;
    private String name;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    
    @Override
    public int compareTo(Person o){
        return this.age-o.age;
    }
    
    @Override
    public String toString(){
        return name+":"+age;
    }
}

測試

public static void main(String[] args) {
        Person person1 = new Person("張三",18);
        Person person2 = new Person("李四",17);
        Person person3 = new Person("王五",19);

        List<Person> list = new ArrayList<>();
        list.add(person1);
        list.add(person2);
        list.add(person3);

        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
}

輸出:

[張三:18, 李四:17, 王五:19]
[李四:17, 張三:18, 王五:19]
6.2、Comparator

Comparator:也是對實現它的每個類的對象進行排序

package java.util;
import ***;

public interface Comparator<T> {
    int compare(T o1, T o2);
    ......
}

如果我們的這個類Person無法修改或者沒有繼承Comparable接口,我們又要對其進行排序,Comparator就可以派上用場了。

將類Person實現的Comparable接口去掉

/**
  * 實體類Person
  */
public class Person {
    private int age;
    private String name;
    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString(){
        return name+":"+age;
    }
}

測試類:

public static void main(String[] args) {
        Person person1 = new Person("張三",18);
        Person person2 = new Person("李四",17);
        Person person3 = new Person("王五",19);

        List<Person> list = new ArrayList<>();
        list.add(person1);
        list.add(person2);
        list.add(person3);

        System.out.println(list);
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1 == null || o2 == null){
                    return 0;
                }
                //o1比o2小,返回負數
                //o1等於o2,等於0
                //o1大於o2,返回正數
                return o1.getAge()-o2.getAge();
            }
        });
        System.out.println(list);
}

輸出:

[張三:18, 李四:17, 王五:19]
[李四:17, 張三:18, 王五:19]

七、常用工具類

7.1、Collections類

java.util.Collections工具類為集合框架提供了很多有用的方法,這些方法都是靜態的,在編程中可以直接調用。整個Collections工具類源碼差不多有4000行,這裏只針對一些典型的方法進行闡述。

7.1.1、addAll

addAll:向指定的集合c中加入特定的一些元素elements

public static <T> boolean addAll(Collection<? super T> c, T… elements)
7.1.2、binarySearch

binarySearch:利用二分法在指定的集合中查找元素

#集合元素T實現Comparable接口的方式,進行查詢
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)

#元素以外部實現Comparator接口的方式,進行查詢
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
7.1.3、sort
#集合元素T實現Comparable接口的方式,進行排序
public static <T extends Comparable<? super T>> void sort(List<T> list)

#元素以外部實現Comparator接口的方式,進行排序
public static <T> void sort(List<T> list, Comparator<? super T> c)
7.1.4、shuffle

shuffle:混排,隨機打亂原來的順序,它打亂在一個List中可能有的任何排列的蹤跡。

#方法一
public static void shuffle(List<?> list)

#方法二,指定隨機數訪問
public static void shuffle(List<?> list, Random rnd)
7.1.5、reverse

reverse:集合排列反轉

#直接反轉集合的元素
public static void reverse(List<?> list)

#返回可以使集合反轉的比較器Comparator
public static <T> Comparator<T> reverseOrder()

#集合的反轉的反轉,如果cmp不為null,返回cmp的反轉的比較器,如果cmp為null,效果等同於第二個方法.
public static <T> Comparator<T> reverseOrder(Comparator<T> cmp)
7.1.6、synchronized系列

synchronized系列:確保所封裝的集合線程安全(強同步)

#同步Collection接口下的實現類
public static <T> Collection<T> synchronizedCollection(Collection<T> c)

#同步SortedSet接口下的實現類
public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)

#同步List接口下的實現類
public static <T> List<T> synchronizedList(List<T> list)

#同步Map接口下的實現類
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)

#同步SortedMap接口下的實現類
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)

7.2、Arrays類

java.util.Arrays工具類也為集合框架提供了很多有用的方法,這些方法都是靜態的,在編程中可以直接調用。整個Arrays工具類源碼有3000多行,這裏只針對一些典型的方法進行闡述。

7.2.1、asList

asList:將一個數組轉變成一個List,準確來說是ArrayList

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
}

注意:這個List是定長的,企圖添加或者刪除數據都會報錯java.lang.UnsupportedOperationException

7.2.2、sort

sort:對數組進行排序,適合byte,char,double,float,int,long,short等基本類型,還有Object類型

#基本數據類型,例子int類型數組
public static void sort(int[] a)

#Object類型數組
#如果使用Comparable進行排序,Object需要實現Comparable
#如果使用Comparator進行排序,可以使用外部比較方法實現
public static void sort(Object[] a)
7.2.3、binarySearch

binarySearch:通過二分查找法對已排序的數組進行查找。如果數組沒有經過Arrays.sort排序,那麼檢索結果未知。

適合byte,char,double,float,int,long,short等基本類型,還有Object類型和泛型。

#基本數據類型,例子int類型數組,key為要查詢的參數
public static int binarySearch(int[] a, int key)

#Object類型數組,key為要查詢的參數
#如果使用Comparable進行排序,Object需要實現Comparable
#如果使用Comparator進行排序,可以使用外部比較方法實現
public static int binarySearch(Object[] a, Object key)
7.2.4、copyOf

copyOf:數組拷貝,底層採用System.arrayCopy(native方法)實現。

適合byte,char,double,float,int,long,short等基本類型,還有泛型數組。

#基本數據類型,例子int類型數組,newLength新數組長度
public static int[] copyOf(int[] original, int newLength)

#T為泛型數組,newLength新數組長度
public static <T> T[] copyOf(T[] original, int newLength)
7.2.5、copyOfRange

copyOfRange:數組拷貝,指定一定的範圍,底層採用System.arrayCopy(native方法)實現。

適合byte,char,double,float,int,long,short等基本類型,還有泛型數組。

#基本數據類型,例子int類型數組,from:開始位置,to:結束位置
public static int[] copyOfRange(int[] original, int from, int to)

#T為泛型數組,from:開始位置,to:結束位置
public static <T> T[] copyOfRange(T[] original, int from, int to)
7.2.6、equals和deepEquals

equals:判斷兩個數組的每一個對應的元素是否相等(equals, 對於兩個數組的元素a和a2有a==null ? a2==null : a.equals(a2))

#基本數據類型,例子int類型數組,a為原數組,a2為目標數組
public static boolean equals(int[] a, int[] a2)

#Object數組,a為原數組,a2為目標數組
public static boolean equals(Object[] a, Object[] a2)

deepEquals:主要針對一個數組中的元素還是數組的情況(多維數組比較)

#Object數組,a1為原數組,a2為目標數組
public static boolean deepEquals(Object[] a1, Object[] a2)
7.2.7、toString和deepToString

toString:將數組轉換成字符串,中間用逗號隔開

#基本數據類型,例子int類型數組,a為數組
public static String toString(int[] a)

#Object數組,a為數組
public static String toString(Object[] a)

deepToString:當數組中又包含數組,就不能單純的利用Arrays.toString()了,使用此方法將數組轉換成字符串

#Object數組,a為數組
public static String deepToString(Object[] a)

八、迭代器

JCF的迭代器(Iterator)為我們提供了遍歷容器中元素的方法。只有容器本身清楚容器里元素的組織方式,因此迭代器只能通過容器本身得到。每個容器都會通過內部類的形式實現自己的迭代器。

ArrayList<String> list = new ArrayList<String>();
list.add(new String("a1"));
list.add(new String("a2"));
list.add(new String("a3"));
Iterator<String> it = list.iterator();//得到迭代器
while(it.hasNext()){
    String obj = it.next();//訪問元素
    System.out.println(obj);
}

JDK 1.5 引入了增強的for循環,簡化了迭代容器時的寫法

//使用增強for迭代
ArrayList<String> list = new ArrayList<String>();
list.add(new String("a1"));
list.add(new String("a2"));
list.add(new String("a3"));
for(String obj : list){
    //enhanced for statement
    System.out.println(obj);
}

九、總結

以上,主要是對java集合的整體架構進行簡單的介紹,如果有理解不當之處,歡迎指正。

十、參考

1、JDK1.7&JDK1.8 源碼
2、
3、

作者:炸雞可樂
原文出處:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

澳洲野火 煙雲飄1萬2000多公里觸及巴西

摘錄自2020年1月8日中央社報導

澳洲野火延燒,巴西國家太空署(National Institute for Space Research, INPE)旗下的遙測部門今天推文表示,野火煙霾今天觸及巴西。

遙測部門(Department of Remote Sensing)指著衛星影像說,澳洲大火煙霾一路飄洋過海來到巴西最南端的南大河州(Rio Grande do Sul)。

民間氣象公司MetSul也在推特發文說煙雲抵達南大河州首府快樂港(Porto Alegre),但強調:「從澳洲飄來的煙霾幾乎難以察覺,即使衛星圖顯示大快樂港地區上空被煙霧籠罩。」

智利氣象局昨(6日)表示,智利和阿根廷能看見野火產生的煙霾。這意味著煙雲飄了1萬2000多公里到達南美洲。不過智利氣象局表示,飄來的煙霾並不會對南美居民的健康產生負面影響。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

LG 化學將在歐洲建電動車用電池新廠 年產能為 5 萬個

車用電池龍頭 LG 化學(LG Chem)23 日宣布,將在車廠密集的歐洲興建一座電動車(EV)用電池工廠,年產能為 5 萬個。報導指出,LG 化學上述 EV 電池新廠的落腳地點雖尚未敲定,不過預估最有可能會選在 LG 電子、LG Display 等韓廠進駐的波蘭弗羅茨瓦夫。   據報導,LG 化學關係人士表示,待上述歐洲電池新廠量產後,將可大幅降低物流費用,屆時將可擴大歐洲市場的供貨規模。   據報導,目前 LG 化學已擁有 2 座電池工廠,分別為南韓忠清北道的梧倉工廠以及美國密西根州工廠,年產能分別為 20 萬個、5 萬個,且 LG 化學位於南京、年產能為 10 萬個的電池新廠也將在年末完工,並預計於 2016 年初開始進行生產。  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

深圳取消電動車搖號

僅取消搖號程式,其他條件和程式維持不變   昨日,深圳市小汽車指標調控管理中心發佈公告,調整了今年待配置的電動小汽車增量指標配置方式。即單位和個人申請今年度待配置電動小汽車增量指標的,符合申請條件並通過資格審查後,即直接發放電動小汽車增量指標,不再實施搖號;市公安交警局憑指標證明檔和有關材料辦理電動小汽車 上牌登記手續。值得注意的是,今年待配置電動小汽車增量指標的申請截止日期為12月31日,按照“審核通過時間 優先、申請報名時間優先”的原則配置,指標配置完畢即止。   據瞭解,汽車租賃電動小汽車增量指標的有效期至今年12月31日,逾期未使用的,視為放棄指標,並按照《深圳市小汽車增量調控管理實施細則》的規定,自有效期屆滿次日起,指標持有人兩年內不得申請增量指標。此外,汽車租賃企業還可以根據相關規定申請普通小汽車增量指標和電動小汽車增量指標。   深圳去年底宣佈實施小汽車限購,根據年初公佈的《深圳市小汽車增量調控管理實施細則》,今年全年深圳將配置10萬個小汽車增量指標,其中以搖號方式配置電動小汽車增量指標為2萬個。截至目前,已經進行了8期電動小汽車增量指標搖號,扣除已經成功配置的指標數和剛劃出的2000個分時租賃電動小汽車指標,今年待配置的電動小汽車增量指標還剩9213個。  
337家企業分享4000個租賃電動小汽車指標   昨天,我市舉行了租賃電動小汽車指標搖號,4000個指標全部配置完成,337家企業分享了這些指標。參加本輪搖號的有效編碼數共1057732個。“租賃電動小汽車指標是以企業為申請單位的,每個企業可以申請4000個指標。我們在對申請企業進行資格審核時發現有一個人註冊了35家公司,每個公司都申請了4000個指標。後來我們約談了相關企業,還剔除了部分不符合申請條件的企業,這樣最終符合條件的申請編 碼數達到了1057732個。”     文章來源:深圳特區報 

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

Windows終端利器Cmder

在IT這一行,大部分情況下都是推薦大家使用Linux或者類Unix操作系統去編程,Linux作為一代優秀的操作系統,已經人盡皆知,在IT行業已經成為核心。有條件的大佬都選擇了使用mac編程,最優秀的莫過於終端體驗了,與Linux完全一致的命令行,帶來了許許多多的方便,但是使用Windows的用戶呢?相信大家都使用過cmd終端,它到底好不好呢。相信大家心中已經有了評判。

一、為什麼要換成cmder

現在我就要推薦一款Windows下的終端—>cmder
先來上兩張圖給大家看看

都不用我說,一眼就能分辨出他倆的區別了,其實他倆最大的區別是cmder完全支持Linux命令行,包括vi,而且可以多開,快捷鍵複製粘貼,分屏等,功能非常強大

二、下載和安裝

1.下載

官網自己下載也可以

  • 在官網下載的時候有兩個版本
    • Mini版本,只有簡單的命令行
    • Full版本,包含git功能(分佈式版本控制系統的git)

我推薦大家安裝Full版本,這樣就可以不用單獨安裝git了

2.安裝

安裝非常簡單,下載完成后,直接解壓到你存放軟件的目錄就好了

然後雙擊一下cmder.exe就可以先簡單體驗一下了

三、個性化設置

這款軟件可以完全替代Windows系統自帶的cmd終端,當然需要一點人性化的設置

1.配置環境變量

我就只上圖了,環境變量配置太過簡單了,百度上太多了,都是通用套路,配置完環境變量,就可以直接在Windows+r鍵里運行cmder打開終端了

上圖中我把git也配置進去了,這樣就不會說git不是內部或者外部命令了

2.配置右鍵菜單啟動

右鍵管理員身份運行cmder.exe,然後把下面的命令複製到cmder中執行一次

// 設置任意地方鼠標右鍵啟動Cmder
Cmder.exe /REGISTER ALL

3.進入設置的方法

右下角的,然後選擇Settings或者直接使用快捷鍵Windows+Alt+p打開設置

如果不習慣英文,可以將設置改成中文

下次再次打開設置,又會中文,只有這個設置生效一次,其他的都可以永久生效

4.設置字體風格等

設置字體的風格,大小等,圖中紅色位置不要勾選,否則會出現cmder終端字體重疊錯位的問題

終端界面的字體大小在設置里可以修改,也可以在終端界面滑動鼠標滾輪,或者觸控板雙擊縮放調整字體大小

5.窗口位置大小記憶

勾選這兩個設置,只需要設置一次,下次會自動記住上次終端在桌面出現的位置和窗口大小

6.設置vi模式下ESC鍵最小化窗口的問題

  • 將圖中紅色改成除了總是的其他選項,否則使用vi時會出現無法切換模式的問題
  • 勾選綠色的選項可以解決打開多個終端,任務欄显示多個窗口的問題

7.解決中文亂碼的問題

在使用ls命令時,中文亂碼的解決方案,將下面的代碼複製到圖中位置

set LANG=zh_CN.UTF-8
set LC_ALL=zh_CN.utf8

8.強製作為默認終端

  • 圖中綠色設置可以強制將cmder註冊成Windows的默認終端

    設置此選項后,系統啟動后就會生效,且,即使你打開的是cmd,也會被放到cmder的窗口中執行

  • 紅色選項可以解決每次關閉控制台時,彈出確認關閉的彈窗

9.解決粘貼多行文本時的彈窗

例如在終端中執行多行SQL語句,總會彈出提示,勾選選項可以解決

10.將命令提示改成$

默認的命令提示符是λ,大家都知道Linux是$,這裏提供一下修改的方法,並不是必須的

1)首先在cmder的安裝目錄下,找到vendor/目錄,然後找到clink.lua文件

2)右鍵使用sublime打開

  • 沒有sublime或者notepad++打開也可以,還沒有的話,記事本也可以的

3)打開后可以Ctrl+F查找下面的字段
local lambda =
4)將local lambda =""的值替換成$

5)保存關閉,重啟終端

11.將Idea的Terminal終端換成cmder

1)在idea中打開其他設置界面,如圖所示

在idea中settings是對當前項目生效,Other Settings是對所有項目生效

2)如圖中修改shell Path的路徑,替換成下面的內容

注意將cmder安裝目錄換成你的安裝目錄

//這種方式比較可靠,避免了環境變量失效的問題
"cmd.exe" /k ""你的cmder安裝目錄\vendor\init.bat""

//或者,這個需要有環境變量
"cmd.exe" /k ""%環境變量配置的cmder home目錄名稱%\vendor\init.bat""

3)再次打開Terminal終端就可以使用Linux命令了

12.將vscode的Terminal終端設置成cmder

1)打開設置

2)搜索code save,點擊打開設置json文件

3)將下面的代碼粘貼到文件中,修改為自己需要的內容

注意修改cmder的安裝目錄為自己的安裝目錄

// 設置終端為cmder
"terminal.integrated.shell.windows": "cmd.exe",
"terminal.integrated.env.windows": {
    //設置cmder的根目錄
    "CMDER_ROOT": "cmder的根目錄"
},
"terminal.integrated.shellArgs.windows": [
    "/k",
    //設置啟動初始化目錄
    "cmder的根目錄\\vendor\\init.bat"
],

//下面的設置可以不需要
//終端顏色配置
"workbench.colorCustomizations": {
    //可以將鼠標放到下面的色號上根據自己的偏好進行選擇
    "terminal.foreground": "#37FF13",
    "terminal.background": "#2b2424"
},
"terminal.integrated.cursorBlinking": true,
//設置terminal中的行高
"terminal.integrated.lineHeight": 1.1,
"terminal.integrated.letterSpacing": 0.1,
"terminal.integrated.fontSize": 12, //字體大小設置
"terminal.integrated.fontFamily": "monaco", //字體設置
"terminal.integrated.shell.linux": "/bin/zsh"

4)Ctrl+J打開終端,就可以使用了

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

印尼水患災情慘重 雅加達省長遭民眾控告

摘錄自2020年1月14日中央社報導

印尼一名律師今天(14日)表示,在暴雨引發洪水及土石流災情,導致數十人喪命、數千人無家可歸後,雅加達省長阿尼斯(AniesBaswedan)因此被這座大城市的居民控告。

超過200名水患受災民眾昨天在首都雅加達(Jakarta)地方法院提出集體訴訟,尋求總計約430億印尼盾(約新台幣9000萬元)的賠償金。

這起訴訟指出,阿尼斯未能替雅加達這座大型城市提供合適的預警系統及有效的緊急救難措施,好讓人民的性命及財務損失降到最低。

雅加達的法務局沒有立即回應置評請求。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開