以你喜歡的方式(思惟導圖或其餘)概括總結集合相關內容。
答:
java
答:算法
public boolean contains(Object o) { return indexOf(o) >= 0; } public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; } public boolean equals(Object obj) { return (this == obj); }
從上能夠看出,contians方法是先判斷對象是否爲null,對象爲空,就返回列表中第一個null的索引,若是對象不爲空就與列表中元素逐一對比,在此過程當中會調用equals方法來比較兩個對象的引用是否相同,最終沒有包含該對象的時候返回-1。數組
public E remove(int index) { RangeCheck(index); E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; return oldValue; }
private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
答:函數
public ArrayList() { super(); this.elementData = EMPTY_ELEMENTDATA;//EMPTY_ELEMENTDATA是個空的Object[],將elementData初始化,elementData也是Object[]類型 }
在構造函數中,ArrayList類中定義了elementData數組(private transient Object[] elementData)來存放對象,這個數組是Object類型,即不管放入什麼引用類型,都會包裝成Object類型存入,因此無需考慮具體類型。學習
答:add()有兩個方法,boolean add(E),void add(int ,E)this
public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
private void ensureCapacityInternal(int minCapacity) { if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }
要添加一個元素,先判斷size+1(size是數組中數據的個數)這個個數數組可否放得下,用ensureCapacityInternal()這個方法判斷數組長度(數組.length())可否夠用。當數組爲空時沒有長度,就默認minCapacity變成10,即默認數組大小爲10。設計
private void ensureExplicitCapacity(int minCapacity) { modCount++; if (minCapacity - elementData.length > 0) grow(minCapacity); }
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1) if (newCapacity - minCapacity < 0)//空數組時,真正初始化elementData大小爲10 newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0)y newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); //肯定新容量,拷貝數組,改變容量大小 }
擴容時,會將原來數組的大小給oldCapacity,newCapacity是1.5倍的oldCapacity。newCapacity - MAX_ARRAY_SIZE > 0判斷newCapacity是否超過最大容量限制,超過就將能給的最大值給newCapacity,此時肯定新容量大小,就拷貝原來數組,並改變容量大小。3d
答:rangeCheck用於判斷數組是否越界,只有本類移除、增添等方法中須要使用,就用private將其封裝起來,用戶只須要知道移除,增添等方法,不須要知道具體的實現過程。指針
答:經過哈希算法進行肯定存儲位置。先調用hashCode()方法,計算出哈希值,找到對應的鏈表,調用equals方法判斷該鏈表中是否有重複的對象。code
答:時間複雜度爲O(1)。經過哈希算法得出位置就將元素直接添加進表中,這個過程的時間複雜度爲O(1)。
題集jmu-Java-05-集合之ArrayListIntegerStack
答:
答:接口IntegerStack與上次自定義接口相同, ArrayListIntegerStack實現了該接口。此時咱們無需再從新寫一個棧並重寫實現方法。實現該接口後,咱們只需編寫具體方法就能夠了,減小沒必要的代碼量,讓代碼更爲靈活。
答:
public class CharatorStack { private List<Character> list; public CharatorStack() { List<Character> list=new ArrayList<>(); this.list = list; } //入棧 public void push(char c) { list.add(c); } //出棧,如棧爲空,則返回null。 public Character pop(int i) { if(list.size()==0) return null; return list.remove(i);//出棧時注意移除出棧元素 } //得到棧頂元素,如棧頂爲空,則返回null。注意:不要出棧 public Character peek() { if(list.size()-1==0) return null; return list.get(list.size()-1); } //如過棧爲空返回true public boolean empty() { if(list.size()==0) return true; else return false; } }
public class Main201621123003 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); CharatorStack stack=new CharatorStack(); while(true){ String str=sc.next(); if(str.equals("end")) break; char[] c=str.toCharArray(); for (int i = 0; i < str.length(); i++) { stack.push(c[i]); } int flag=0; for (int i = 0; i < c.length; i++) { if(c[i]==stack.pop(c.length-i-1)){ flag=1; } else{ flag=0; } } if(flag==1) { System.out.println("YES"); } else{ System.out.println("NO"); } } } }
答:
if (Integer.parseInt(strs[0]) <= 1000) { for (int i = 1; i < strs.length; i++) { int temp1 = Integer.parseInt(strs[i]); if (temp1 % 2 == 0) { arrBQueue.add(temp1); } else { arrAQueue.add(temp1); } } } int i=0; if(!arrAQueue.isEmpty()) System.out.print(arrAQueue.poll()); else { System.out.print(arrBQueue.poll()); } while(!arrAQueue.isEmpty()||!arrBQueue.isEmpty()) { i++; if(i%2==0) { if(!arrAQueue.isEmpty()) System.out.print(" "+arrAQueue.poll()); }else { if(!arrAQueue.isEmpty()) System.out.print(" "+arrAQueue.poll()); if(!arrBQueue.isEmpty()) System.out.print(" "+arrBQueue.poll()); } }
題集jmu-Java-05-集合之5-2 統計文字中的單詞數量並按單詞的字母順序排序後輸出 (做業中不要出現大段代碼)
答:該題主要使用TreeSet集合存放不重複的單詞,並利用TreeSet完成按字母順序排序。
題集jmu-Java-05-集合之5-3 統計文字中的單詞數量並按出現次數排序(不要出現大段代碼)
答:
五、輸出List
答:該題難點是如何實現單詞次數按照降序排序,若是次數相同,則按照鍵值的字母升序排序。先將Map集合中每個對象存入List,再從新定義compare方法。
題目集:jmu-Java-05-集合
在碼雲的項目中,依次選擇「統計-Commits歷史-設置時間段」, 而後搜索並截圖
須要有兩張圖(1. 排名圖。2.PTA提交列表圖)
須要將每週的代碼統計狀況融合到一張表中。
周次 | 總代碼量 | 新增代碼量 | 總文件數 | 新增文件數 |
---|---|---|---|---|
1 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 |
4 | 0 | 0 | 0 | 0 |
5 | 739 | 739 | 16 | 16 |
6 | 1084 | 345 | 28 | 12 |
7 | 1180 | 96 | 30 | 2 |
8 | 1627 | 447 | 35 | 5 |
9 | 1986 | 359 | 44 | 9 |