-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
182 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
import java.util.ArrayList; | ||
|
||
/** | ||
* @Auther: lss | ||
* @Date: 2019/2/21 15:37 | ||
* @Description: | ||
*/ | ||
public class LinkedListMap<K, V> implements Map<K, V> { | ||
|
||
private class Node { | ||
public K key; | ||
public V value; | ||
public Node next; | ||
|
||
public Node(K key, V value, Node next) { | ||
this.key = key; | ||
this.value = value; | ||
this.next = next; | ||
} | ||
|
||
public Node(K key) { | ||
this(key, null, null); | ||
} | ||
|
||
public Node() { | ||
this(null, null, null); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return key.toString() + ":" + value.toString(); | ||
} | ||
} | ||
|
||
private Node dummyHead; | ||
private int size; | ||
|
||
public LinkedListMap() { | ||
dummyHead = new Node(); | ||
size = 0; | ||
} | ||
|
||
|
||
@Override | ||
public void add(K key, V value) { | ||
// 确认当前映射有没有要添加的key | ||
Node node = getNode(key); | ||
if (node == null) { | ||
dummyHead.next = new Node(key, value, dummyHead.next); | ||
size++; | ||
} else { | ||
node.value = value; | ||
} | ||
} | ||
|
||
@Override | ||
public V remove(K key) { | ||
|
||
Node prev = dummyHead; | ||
while (prev.next != null) { | ||
if (prev.next.key.equals(key)) | ||
break; | ||
prev = prev.next; | ||
} | ||
|
||
if (prev.next != null) { | ||
Node delNode = prev.next; | ||
prev.next = delNode.next; | ||
delNode.next = null; | ||
size--; | ||
return delNode.value; | ||
} | ||
|
||
return null; | ||
} | ||
|
||
@Override | ||
public boolean contains(K key) { | ||
return getNode(key) != null; | ||
} | ||
|
||
@Override | ||
public V get(K key) { | ||
Node node = getNode(key); | ||
return node == null ? null : node.value; | ||
} | ||
|
||
@Override | ||
public void set(K key, V newValue) { | ||
|
||
Node node = getNode(key); | ||
if (node == null) | ||
throw new IllegalArgumentException(key + "doesn't exits!"); | ||
|
||
node.value = newValue; | ||
} | ||
|
||
private Node getNode(K key) { | ||
|
||
Node cur = dummyHead.next; | ||
while (cur != null) { | ||
if (cur.key.equals(key)) | ||
return cur; | ||
cur = cur.next; | ||
} | ||
return null; | ||
} | ||
|
||
@Override | ||
public int getSize() { | ||
return size; | ||
} | ||
|
||
@Override | ||
public boolean isEmpty() { | ||
return size == 0; | ||
} | ||
|
||
public static void main(String[] args) { | ||
|
||
System.out.println("Pride and Prejudice"); | ||
|
||
ArrayList<String> words = new ArrayList<>(); | ||
if (FileOperation.readFile("pride-and-prejudice.txt", words)) { | ||
System.out.println("Total words: " + words.size()); | ||
|
||
LinkedListMap<String, Integer> map = new LinkedListMap<>(); | ||
for (String word : words) { | ||
if (map.contains(word)) | ||
map.set(word, map.get(word) + 1); | ||
else | ||
map.add(word, 1); | ||
} | ||
|
||
System.out.println("Total different words: " + map.getSize()); | ||
System.out.println("Frequency of PRIDE: " + map.get("pride")); | ||
System.out.println("Frequency of PREJUDICE: " + map.get("prejudice")); | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,52 @@ | ||
import java.util.ArrayList; | ||
|
||
/** | ||
* @Auther: lss | ||
* @Date: 2019/1/31 21:50 | ||
* @Description: | ||
*/ | ||
public class Main { | ||
|
||
private static double testMap(Map<String, Integer> map, String filename) { | ||
|
||
long startTime = System.nanoTime(); | ||
|
||
System.out.println(filename); | ||
ArrayList<String> words = new ArrayList<>(); | ||
if (FileOperation.readFile(filename, words)) { | ||
System.out.println("Total words: " + words.size()); | ||
|
||
for (String word : words) { | ||
if (map.contains(word)) | ||
map.set(word, map.get(word) + 1); | ||
else | ||
map.add(word, 1); | ||
} | ||
|
||
System.out.println("Total different words: " + map.getSize()); | ||
System.out.println("Frequency of PRIDE: " + map.get("pride")); | ||
System.out.println("Frequency of PREJUDICE: " + map.get("prejudice")); | ||
} | ||
|
||
long endTime = System.nanoTime(); | ||
|
||
return (endTime - startTime) / 1000000000.0; | ||
} | ||
|
||
public static void main(String[] args) { | ||
|
||
String filename = "pride-and-prejudice.txt"; | ||
|
||
BSTMap<String, Integer> bstMap = new BSTMap<>(); | ||
double time1 = testMap(bstMap, filename); | ||
System.out.println("BST Map" + time1 + "s"); | ||
|
||
System.out.println(); | ||
|
||
LinkedListMap<String, Integer> linkedListMap = new LinkedListMap<>(); | ||
double time2 = testMap(linkedListMap, filename); | ||
System.out.println(time2); | ||
System.out.println("linkedListMap" + time2 + "s"); | ||
|
||
} | ||
} |