集合和映射
阿新 • • 發佈:2019-02-17
包含 intern hset contains face 枚舉類 return vat .get 定義
計算機科學中,集合是一組可變數量的數據項(也可能是0個)的組合,這些數據項可能共享某些特征,需要以某種操作方式一起進行操作。一般來講,這些數據項的類型是相同的,或基類相同(若使用的語言支持繼承)。列表(或數組)通常不被認為是集合,因為其大小固定,但事實上它常常在實現中作為某些形式的集合使用。集合的種類包括列表,集,多重集,樹和圖。枚舉類型可以是列表或集。
將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多只能映射到一個值。此接口取代 Dictionary類,後者完全是一個抽象類,而不是一個接口。
代碼實現(集合)
接口
package com.company; public interface Set<E> { void add(E e); void remove(E e); boolean contains(E e); int getSize(); boolean isEmpty(); }
線性集合
package com.company; public class ArraySet<E extends Comparable<E>> implements Set<E> { private BST<E> bst; public ArraySet() { bst = new BST<>(); } @Override public void add(E e) { if (!bst.contains(e)) { bst.add(e); } } @Override public void remove(E e) { bst.remove(e); } @Override public boolean contains(E e) { return bst.contains(e); } @Override public int getSize() { return bst.getSize(); } @Override public boolean isEmpty() { return bst.isEmpty(); } }
鏈式集合
package com.company; public class LinkedList<E> { /** * 內部類 */ private class Node { public E e; public Node next; public Node() { this(null, null); } public Node(E e) { this(e, null); } public Node(E e, Node next) { this.e = e; this.next = next; } @Override public String toString() { return e.toString(); } } // 虛擬頭結點 private Node dummyHead; // 節點數量 private int size; // 構造 public LinkedList() { dummyHead = new Node(null, null); size = 0; } // 獲取節點數量 public int getSize() { return size; } // 是否為空 public boolean isEmpty() { return size == 0; } // 頭插法添加節點 public void addFirst(E e) { add(0, e); } // 插入節點 public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("Add failed.Ill index."); } Node prev = dummyHead; for (int i = 0; i < index; i++) { prev = prev.next; } prev.next = new Node(e, prev.next); size++; } // 尾插法添加節點 public void addLast(E e) { add(size, e); } // 查看頭結點的元素 public E getFirst() { return get(0); } // 查看節點元素 public E get(int index) { if (index < 0 || index > size) { throw new IllegalArgumentException("Add failed.Ill index."); } Node cur = dummyHead; for (int i = 0; i < index; i++) { cur = cur.next; } return cur.e; } // 查看尾節點的元素 public E getLast() { return get(size - 1); } // 修改節點的元素 public void set(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("Add failed.Ill index."); } Node cur = dummyHead; for (int i = 0; i < index; i++) { cur = cur.next; } cur.e = e; } // 刪除頭結點 public E removeFirst() { return remove(0); } // 刪除節點 public E remove(int index) { if (index < 0 || index > size) { throw new IllegalArgumentException("Remove failed.Ill index."); } Node prev = dummyHead; for (int i = 0; i < index; i++) { prev = prev.next; } Node delNode = prev.next; prev.next = delNode.next; E ret = delNode.e; delNode = null; size--; return ret; } // 刪除尾節點 public E removeLast() { return remove(size - 1); } // 是否存在元素 public boolean contains(E e) { for (Node cur = dummyHead.next; cur != null; cur = cur.next) { if (cur.e.equals(e)) { return true; } cur = cur.next; } return false; } @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); Node cur = dummyHead.next; while (cur != null) { stringBuilder.append(cur + "->"); cur = cur.next; } stringBuilder.append("NULL"); return stringBuilder.toString(); } }
二叉樹集合
package com.company;
public class BSTSet<E extends Comparable<E>> implements Set<E> {
private BST<E> bst;
public BSTSet() {
bst = new BST<>();
}
@Override
public void add(E e) {
if (!contains(e)) {
bst.add(e);
}
}
@Override
public void remove(E e) {
bst.remove(e);
}
@Override
public boolean contains(E e) {
return bst.contains(e);
}
@Override
public int getSize() {
return bst.getSize();
}
@Override
public boolean isEmpty() {
return false;
}
}
代碼實現(映射)
接口
package com.company;
public interface Map<K, V> {
void add(K key, V value);
V remove(K key);
boolean contains(K key);
V get(K key);
void set(K key, V newValue);
int getSize();
boolean isEmpty();
}
鏈式Map
package com.company;
import java.util.ArrayList;
public class LinkedListMap<K, V> implements Map<K, V> {
private class Node {
public K key;
public V value;
public Node next;
public Node() {
this(null, null, null);
}
public Node(K key) {
this(key, null, null);
}
public Node(K key, V value) {
this(key, value, null);
}
public Node(K key, V value, Node next) {
this.key = key;
this.value = value;
this.next = next;
}
@Override
public String toString() {
return key.toString() + " : " + value.toString();
}
}
private Node dummyHead;
private int size;
public LinkedListMap() {
dummyHead = new Node();
size = 0;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
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 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 add(K key, V value) {
Node node = getNode(key);
if (node == null) {
dummyHead.next = new Node(key, value, dummyHead.next);
size++;
} else
node.value = value;
}
@Override
public void set(K key, V newValue) {
Node node = getNode(key);
if (node == null)
throw new IllegalArgumentException(key + " doesn‘t exist!");
node.value = newValue;
}
@Override
public V remove(K key) {
Node prev = dummyHead;
while (prev.next != null) {
if (prev.next.key.equals(key))
if (prev.next != null) {
Node delNode = prev.next;
prev.next = delNode.next;
size--;
return delNode.value;
}
prev = prev.next;
}
return null;
}
public static void main(String[] args) {
System.out.println("Pride and Prejudice");
ArrayList<String> words = new ArrayList<>();
if (FileOperation.readFile("D:\\Codes\\Data-Structures\\Map\\src\\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"));
}
System.out.println();
}
}
二叉樹Map
package com.company;
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import java.util.ArrayList;
public class BSTMap<K extends Comparable<K>, V> implements Map<K, V> {
private class Node {
public K key;
public V value;
public Node left, right;
public Node() {
this(null, null, null, null);
}
public Node(K key) {
this(key, null, null, null);
}
public Node(K key, V value) {
this(key, value, null, null);
}
public Node(K key, V value, Node left) {
this(key, value, left, null);
}
public Node(K key, V value, Node left, Node right) {
this.key = key;
this.value = value;
this.left = left;
this.right = right;
}
@Override
public String toString() {
return "Node{" +
"key=" + key +
", value=" + value +
", left=" + left +
", right=" + right +
‘}‘;
}
}
private Node root;
private int size;
public BSTMap() {
root = null;
size = 0;
}
@Override
public void add(K key, V value) {
root = add(root, key, value);
}
private Node add(Node node, K key, V value) {
if (node == null) {
size++;
return new Node(key, value);
}
if (key.compareTo(node.key) < 0) {
node.left = add(node.left, key, value);
} else if (key.compareTo(node.key) > 0) {
node.right = add(node.right, key, value);
} else {
node.value = value;
}
return node;
}
private Node min(Node node) {
if (node.left == null) {
return node;
} else {
return min(node.left);
}
}
private Node removeMin(Node node) {
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
} else {
node.left = removeMin(node.left);
return node;
}
}
@Override
public V remove(K key) {
Node node = getNode(root, key);
if (node != null){
root = remove(root, key);
return node.value;
}
return null;
}
private Node remove(Node node, K key) {
if (node == null) {
return null;
}
if (key.compareTo(node.key) < 0) {
node.left = remove(node.left, key);
return node;
} else if (key.compareTo(node.key) > 0) {
node.right = remove(node.right, key);
return node;
} else {
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
} else if (node.right == null) {
Node leftNode = node.left;
node.left = null;
return leftNode;
} else {
Node middleNode = getNode(node.right, key);
middleNode.right = removeMin(node.right);
middleNode.left = node.left;
node.left = node.right = null;
return middleNode;
}
}
}
@Override
public boolean contains(K key) {
return getNode(root, key) != null;
}
@Override
public V get(K key) {
Node node = getNode(root, key);
return node == null ? null : node.value;
}
@Override
public void set(K key, V newValue) {
Node node = getNode(root, key);
if (node == null) {
throw new IllegalArgumentException(key + "doesn‘t exist!");
} else {
node.value = newValue;
}
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
private Node getNode(Node node, K key){
if(node == null)
return null;
if(key.equals(node.key))
return node;
else if(key.compareTo(node.key) < 0)
return getNode(node.left, key);
else // if(key.compareTo(node.key) > 0)
return getNode(node.right, key);
}
public static void main(String[] args) {
System.out.println("Pride and Prejudice");
ArrayList<String> words = new ArrayList<>();
if (FileOperation.readFile("D:\\Codes\\Data-Structures\\Map\\src\\pride-and-prejudice.txt", words)) {
System.out.println("Total words: " + words.size());
BSTMap<String, Integer> map = new BSTMap<>();
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"));
}
System.out.println();
}
}
兩個數組的交集
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new LinkedHashSet<>();
for (int num : nums1) {
set.add(num);
}
ArrayList<Integer> arrayList = new ArrayList<>();
for (int num : nums2) {
if (set.contains(num)) {
arrayList.add(num);
set.remove(num);
}
}
int[] res = new int[arrayList.size()];
for (int i = 0; i < arrayList.size(); i++) {
res[i] = arrayList.get(i);
}
return res;
}
}
兩個數組的交集 II
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums1){
if (!map.containsKey(num)){
map.put(num, 1);
} else {
map.put(num, map.get(num) + 1);
}
}
ArrayList<Integer> list = new ArrayList<>();
for (int num : nums2) {
if (map.containsKey(num)) {
list.add(num);
map.put(num, map.get(num) - 1);
if (map.get(num) == 0){
map.remove(num);
}
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}
集合和映射