From 93ddb61908bdb60c3ebe594bb9dff12cfcdccbee Mon Sep 17 00:00:00 2001 From: johnChnia Date: Fri, 7 Apr 2017 01:52:00 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=8F=8C=E5=90=91=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0LRU=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/johnChnia/coding2017/basic/Stack.java | 2 + .../basic/linklist/LRUPageFrame.java | 130 ++++++++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 30 ++++ .../basic/{ => linklist}/LinkedList.java | 6 +- .../coding2017/basic/ArrayListTest.java | 1 - .../coding2017/basic/LinkedListTest.java | 2 +- 6 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java rename group24/315863321/src/main/java/com/johnChnia/coding2017/basic/{ => linklist}/LinkedList.java (98%) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/Stack.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/Stack.java index f43ea52397..3ddab60493 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/Stack.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/Stack.java @@ -1,5 +1,7 @@ package com.johnChnia.coding2017.basic; +import com.johnChnia.coding2017.basic.linklist.LinkedList; + import java.util.EmptyStackException; /** diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..c74a9a3202 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java @@ -0,0 +1,130 @@ +package com.johnChnia.coding2017.basic.linklist; + +/** + * Created by john on 2017/4/6. + */ +public class LRUPageFrame { + + private static class Node { + + Node prev; + Node next; + int pageNum; + + Node() { + } + } + + private int capacity; + + + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + + } + + /** + * 获取缓存中的对象 + * 1 2 3 + * + * @param pageNum 对象值 + */ + public void access(int pageNum) { + if (first == null) { + Node node = createNode(pageNum); + first = last = node; + capacity--; + } else if (getNode(pageNum) == null) { + if (capacity == 0) { + Node lastNode = first; + while (lastNode.next != null) { + lastNode = lastNode.next; + } + lastNode.prev.next = null; + last = lastNode.prev; + delete(lastNode); + capacity++; + } + Node node = createNode(pageNum); + node.next = first; + node.prev = null; + first.prev = node; + first = node; + capacity--; + + } else { + if (first.pageNum != pageNum) { + Node node = getNode(pageNum); + if (node.next != null) { + node.prev.next = node.next; + node.next.prev = node.prev; + } else { + node.prev.next = null; + node.next = first; + node.prev = null; + } + node.next = first; + node.prev = null; + first.prev = node; + first = node; + } + } + + } + + /** + * 删除节点 + */ + private void delete(Node node) { + node.pageNum = 0; + node.next = null; + node.prev = null; + } + + /** + * @param pageNum 页号 + * @return 节点 + */ + private Node createNode(int pageNum) { + Node node = new Node(); + node.pageNum = pageNum; + node.next = null; + node.prev = null; + return node; + } + + + /** + * @param pageNum 页号 + * @return 如果LRUPageFrame包含该pageNum就返回该节点,否则返回null + */ + private Node getNode(int pageNum) { + for (Node node = first; node != null; node = node.next) { + if (node.pageNum == pageNum) { + return node; + } + } + return null; + } + + + public String toString() { + StringBuilder buffer = new StringBuilder(); + Node node = first; + while (node != null) { + buffer.append(node.pageNum); + + node = node.next; + if (node != null) { + buffer.append(","); + } + } + return buffer.toString(); + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..e71abd393d --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,30 @@ +package com.johnChnia.coding2017.basic.linklist; + +import org.junit.Assert; +import org.junit.Test; + + +public class LRUPageFrameTest { + + @Test + public void testAccess() { + LRUPageFrame frame = new LRUPageFrame(3); + frame.access(7); + frame.access(0); + frame.access(1); + Assert.assertEquals("1,0,7", frame.toString()); + frame.access(2); + Assert.assertEquals("2,1,0", frame.toString()); + frame.access(0); + Assert.assertEquals("0,2,1", frame.toString()); + frame.access(0); + Assert.assertEquals("0,2,1", frame.toString()); + frame.access(3); + Assert.assertEquals("3,0,2", frame.toString()); + frame.access(0); + Assert.assertEquals("0,3,2", frame.toString()); + frame.access(4); + Assert.assertEquals("4,0,3", frame.toString()); + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/LinkedList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java similarity index 98% rename from group24/315863321/src/main/java/com/johnChnia/coding2017/basic/LinkedList.java rename to group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java index 01ba928128..10f7edd0a6 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/LinkedList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java @@ -1,4 +1,6 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.linklist; + +import com.johnChnia.coding2017.basic.List; import java.util.NoSuchElementException; @@ -345,7 +347,7 @@ public int[] getElements(LinkedList list) { valueNode = valueNode.next; indexOfArray++; } else { - mapNode = mapNode.next; + valueNode = valueNode.next; } indexOfList++; } diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java index e0df250c37..4b8d986990 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java @@ -54,7 +54,6 @@ public void testRemoveElementByIndex() { arrayList4.add(i); } Object removed = arrayList4.remove(4); - System.out.println(arrayList4); assertThat(removed, equalTo(4)); assertThat(arrayList4.size(), equalTo(5)); } diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/LinkedListTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/LinkedListTest.java index 9a72c0d54a..941d524987 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/LinkedListTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/LinkedListTest.java @@ -2,7 +2,7 @@ import org.junit.Before; import org.junit.Test; - +import com.johnChnia.coding2017.basic.linklist.LinkedList; import java.util.Arrays; import static org.hamcrest.CoreMatchers.containsString; From e38a8907f9291ca131b3f1ba12dd80227d57ccef Mon Sep 17 00:00:00 2001 From: johnChnia Date: Fri, 7 Apr 2017 14:40:47 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9LRU-=E5=B0=BE=E6=8C=87?= =?UTF-8?q?=E9=92=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java index c74a9a3202..cdc327fb30 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrame.java @@ -30,7 +30,6 @@ public LRUPageFrame(int capacity) { /** * 获取缓存中的对象 - * 1 2 3 * * @param pageNum 对象值 */ @@ -65,8 +64,7 @@ public void access(int pageNum) { node.next.prev = node.prev; } else { node.prev.next = null; - node.next = first; - node.prev = null; + last = node.prev; } node.next = first; node.prev = null; From 1e76584b0dcbbfd0a33b7224391422303b6f549d Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sat, 8 Apr 2017 22:02:30 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9arrayList-=E8=80=81?= =?UTF-8?q?=E5=B8=88=E6=8C=87=E5=87=BA=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/johnChnia/coding2017/basic/ArrayList.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java index 8c4b8807be..464f1f5c7f 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java @@ -4,6 +4,7 @@ /** * Created by john on 2017/3/8. + * * @// TODO: 2017/4/1 实现Iterator 接口 */ @@ -23,7 +24,7 @@ public ArrayList() { /** * Constructs an list with the specified initial capacity. * - * @param initialCapacity + * @param initialCapacity capacity of arrayList. * @throws IllegalArgumentException if the specified initial capacity * is negative or zero */ @@ -88,7 +89,9 @@ public void add(int index, E element) { * @throws IndexOutOfBoundsException {@inheritDoc} */ public E remove(int index) { - rangeCheckForAdd(index); + if (index < 0 || index >= size) { + throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); + } Object oldValue = elementData[index]; int numMoved = size() - index - 1; if (numMoved > 0) { From 61a6da56c8c9e21e543f326da227f0001107e7b1 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sat, 8 Apr 2017 22:08:52 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9arrayList=E4=B8=AD?= =?UTF-8?q?=E8=80=81=E5=B8=88=E6=8C=87=E5=87=BA=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../johnChnia/coding2017/basic/ArrayList.java | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java index 464f1f5c7f..80bb60298e 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java @@ -71,7 +71,7 @@ public void add(E element) { * @throws IndexOutOfBoundsException {@inheritDoc} */ public void add(int index, E element) { - rangeCheckForAdd(index); + rangeCheck(index); ensureCapacityInternal(size + 1); System.arraycopy(elementData, index, elementData, index + 1, size - index); @@ -86,12 +86,10 @@ public void add(int index, E element) { * * @param index the index of the element to be removed * @return the element that was removed from the list - * @throws IndexOutOfBoundsException {@inheritDoc} + * @throws IndexOutOfBoundsException {@inheritDoc} index out of B */ public E remove(int index) { - if (index < 0 || index >= size) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } + rangeCheck(index); Object oldValue = elementData[index]; int numMoved = size() - index - 1; if (numMoved > 0) { @@ -170,14 +168,6 @@ public Object[] toArray() { return Arrays.copyOf(elementData, size()); } - /** - * A version of rangeCheck used by add and addAll. - */ - private void rangeCheckForAdd(int index) { - if (index > size() - 1 || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - } /** * Constructs an IndexOutOfBoundsException detail message. @@ -195,7 +185,7 @@ private String outOfBoundsMsg(int index) { * which throws an ArrayIndexOutOfBoundsException if index is negative. */ private void rangeCheck(int index) { - if (index >= size()) { + if (index < 0 || index >= size()) { throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } }