Hướng dẫn sử dụng nền tảng tập hợp trong Java (Java Collection Framework)
1. Giới thiệu
2. Ví dụ bắt đầu
package org.o7planning.tutorial.javacollection.helloworld;
import java.util.LinkedList;
public class HelloLinkedList {
public static void main(String[] args) {
// Tạo một đối tượng LinkedList.
LinkedList<String> list = new LinkedList<String>();
// Thêm một số phần tử vào danh sách.
list.add("F");
list.add("B");
list.add("D");
list.add("E");
list.add("C");
// Thêm phần tử vào cuối danh sách.
list.addLast("Z");
// Thêm phần tử vào vị trí đầu tiên của danh sách.
list.addFirst("A");
// Trèn một phần tử vào ví trí có chỉ số 1.
list.add(1, "A2");
// Ghi ra tất cả các phần tử của danh sách:
System.out.println("Original contents of list: " + list);
// Loại bỏ một phần tử khỏi danh sách
list.remove("F");
// Loại bỏ phần tử tại vị trí có chỉ số 2.
list.remove(2);
// In ra danh sách sau khi đã xóa 2 phần tử.
System.out.println("Contents of list after deletion: " + list);
// Loại bỏ phần tử đầu tiên và cuối cùng trong danh sách.
list.removeFirst();
list.removeLast();
// In ra danh sách sau khi đã xóa.
System.out.println("List after deleting first and last: " + list);
// Lấy ra phần tử tại chỉ số 2.
Object val = list.get(2);
// Sét đặt lại phần tử tại vị trí có chỉ số 2.
list.set(2, (String) val + " Changed");
System.out.println("List after change: " + list);
}
}
Original contents of list: [A, A2, F, B, D, E, C, Z]
Contents of list after deletion: [A, A2, D, E, C, Z]
List after deleting first and last: [A2, D, E, C]
List after change: [A2, D, E Changed, C]
package org.o7planning.tutorial.javacollection.helloworld;
import java.util.HashMap;
public class HelloHashMap {
public static void main(String[] args) {
// Tạo một đối tượng HashMap lữu trữ các cặp, mã số nhân viên và tiền lương.
// String key: Mã số nhân viên
// Float value: Tiền lương.
HashMap<String, Float> salaryMap = new HashMap<String, Float>();
salaryMap.put("E01", 1000f);
salaryMap.put("E02", 12000f);
salaryMap.put("E03", 12300f);
salaryMap.put("E04", 1000f);
salaryMap.put("E05", 300.5f);
// Lấy ra tiền lương của nhân viên 'E02'
Float salary= salaryMap.get("E01");
System.out.println("Salary of employee E01 = "+ salary);
// Cập nhập tiền lương cho nhân viên 'E05'
salaryMap.put("E05", 400f);
System.out.println("Salary of employee E05 = "+ salaryMap.get("E05"));
}
}
Salary of employee E01 = 1000.0
Salary of employee E05 = 400.0
3. Các giới hạn của việc sử dụng mảng - Một gợi ý giải quyết vấn đề.
- Mảng rất cơ bản và quen thuộc .
- lưu trữ các kiểu tham chiếu, các kiểu nguyên thủy
- int[] myArray=new int[]{1,4,3};
- Object[] myArrayObj =new Object[]{"Object",new Integer(100)};
- Mảng có kích cỡ và số chiều cố định.
- Khó khăn cho việc mở rộng mảng
- Các phần tử được đặt và tham chiếu một cách liên tiếp nhau trong bộ nhớ.
- Khó khăn cho việc xóa một phần tử ra khỏi mảng .
Rõ ràng mảng không phải là một cách tốt cho nhiều trường hợp của ứng dụng .
Hãy xem các đặc điểm của LinkedList:
- Các phần tử trong danh sách này có thể nằm cách ly nhau (không liên tục) trong bộ nhớ .
- Nó thực sự là một liên kết có tính hai chiều giữa các phần tử.
- Mỗi phần tử trong danh sách cầm giữ một tham chiếu đến đối phần tử đằng trước nó và tham chiếu đến phần tử ngay sau nó.
Cũng giống như một nhóm người xếp hàng, mỗi người chỉ cần nhớ người đứng trước họ là ai, và người đứng sau họ là ai.
Xóa một phần tử ra khỏi LinkedList cũng giống bỏ một người ra khỏi hàng đang sắp xếp, hai người đứng gần người này phải cập nhập lại thông tin người đứng trước, đứng sau họ là ai.
Chú ý: LinkedList là một trong các giải pháp giải quyết hạn chế của mảng, ArrayList cũng là cách quản lý tập hợp dữ liệu, giải quyết được các hạn chế của mảng, nhưng cách thức quản lý dữ liệu của nó khác.
4. Tổng quan về Java Collections Framework
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
- Nhóm Collection lưu trữ các đối tượng.
- Có 3 nhánh con trong nhóm Collection: Queue, List, Set .
- Các phần tử có thể giống nhau hoặc không phụ thuộc vào thuộc nhánh nào trong 3 nhánh kể trên. (Sẽ được nói đến sau) .
- Nhóm Map lưu trữ các cặp key/value
- Các cặp key/value chứa trong Map (bản đồ) là luôn có key khác nhau giữa các cặp
- Nếu biết key có thể lấy ra giá trị value trong Map ứng với key này .
Collection<String> c=new ArrayList<String>();
// Thêm phần tử vào tập hợp.
c.add("One");
Map<Integer,String> m=new LinkedHashMap<Integer,String>();
Integer key=new Integer(123);
String value="One two three";
// Thêm một cặp 'key/value' vào Map m.
// Nếu 'key' đã tồn tại, 'value' sẽ được thay bởi giá trị mới.
m.put(key,value);
// In ra giá trị ứng với 'key' (khóa).
System.out.println(m.get(new Integer(123));
- java.util.Iterator
- Giống như một máy lặp để lấy dữ liệu,cách truy cập lần lượt từ phần tử này đến phần tử khác.
- java.util.RandomAccess
- Cách truy cập ngẫu nhiên, ví dụ cho vị trí phần tử và lấy ra phần tử đó trong tập hợp
- Ví dụ lớp java.util.Vector thực hiện interface này có thể lấy phần tử ngẫu nhiên vector.get(int index).
- Nhóm Collection cũng có thể truy cập theo kiểu lần lượt bằng cách gọi phương thức iterator() để lấy được đối tượng Iterator .
- java.util.Collection mở rộng từ interface java.lang.Iterable (có thể lặp được) do đó nó thừa kế phương thức public Iterator<E> iterator().
public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
Chú ý: Đối với các đối tượng trong nhóm List bạn cũng có thể lấy ra đối tượng ListIterator, bộ lặp này cho phép bạn lùi và tiến vị trí con trỏ trên tập hợp thay vì chỉ có thể tiến như của Iterator.
5. Nhóm Collection
public interface Collection<E> extends java.lang.Iterable<E> {
//
// Thêm một phần tử vào Collection trả về true nếu Collection thay đổi sau
// khi gọi method và trả về false nếu Collection này không cho phép trùng
// lặp và E o đã có trong Collection rồi (optional operation).
//
boolean add(E o);
//
// Thêm tập hợp vào Collection ,trả về true nếu thực sự Collection thay đổi
// sau khi gọi method (optional operation).
//
boolean addAll(Collection<? extends E> c);
// Xóa tất cả các phần tử ra khỏi Collection .(optional operation).
void clear();
// Kiểm tra xem Collection có chứa Object o không
boolean contains(Object o);
// Kiểm tra xem Collection có chứa tất cả các phần tử trong Collection c
// không.
boolean containsAll(Collection<?> c);
// So sánh Collection này với Object o
boolean equals(Object o);
int hashCode();
// Trả về true nếu Collection này không chứa phần tử nào
boolean isEmpty();
//
// Xóa đối tượng o ra khỏi Collection trả về true nếu thực sự có một phần tử
// bị xóa khỏi (optional operation).
//
boolean remove(Object o);
//
// Xóa các phần tử trong Collection này giống với các phần tử của Collection c
//
boolean removeAll(Collection<?> c);
//
// Kiểm tra xem Collection này chứa mọi phần tử mà Collection c chứa
// (optional operation).
///
boolean retainAll(Collection<?> c);
// Trả về số phần tử trong Collection.
int size();
// Chuyển Collection thành mảng các đối tượng
Object[] toArray();
<T> T[] toArray(T[] a);
// Trả về một bộ lặp để duyệt trên các phần tử của tập hợp.
Iterator<E> iterator();
}
package org.o7planning.tutorial.javacollection.collection;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
public class CollectionAndIterator {
public static void main(String[] args) {
// Tạo một đối tượng Collection rỗng.
// Một tập hợp chỉ chứa các String.
Collection<String> coll = new Vector<String>();
coll.add("Collection");
coll.add("Queue");
coll.add("List");
coll.add("Map");
// In ra số phần tử của tập hợp (collection) này.
System.out.println("Size:" + coll.size());
// Lấy ra đối tượng Iterator để truy cập vào các phần tử của tập hợp.
// Đối tượng Iterator này chỉ chứa các String.
Iterator<String> ite = coll.iterator();
// Kiểm tra xem Iteractor còn phần tử tiếp theo hay không?
while (ite.hasNext()) {
// Lấy ra phần tử tại vị trí con trỏ đang đứng
// Sau đó di chuyển con trỏ thêm 1 bước.
String s = ite.next();
System.out.println("Element:" + s);
}
}
}
Size:4
Element:Collection
Element:Queue
Element:List
Element:Map
java.util.Queue | java.util.List | java.util.Set |
Cho phép chứa các phần tử trùng lặp | Cho phép chứa các phần tử trùng lặp | Không cho phép chứa các phần tử trùng lặp |
Không cho phép chứa các phần tử null | Cho phép chứa nhiều phần tử null | Tùy theo class thi hành Set hỗ trợ chứa phần tử null hay không .Nếu có hỗ trợ thì chỉ chứa nhiều nhất 1 phần tử null nếu có. |
Chú ý: SortedSet là một interface con của Set nó có thể chứa các phần tử có thứ tự.
- Cho phép phần tử trùng lặp
- Cho phép 0 hoặc nhiều phần tử null.
- Là một tập hợp có tuần tự.
// Trả về đối tượng ListIterator, để duyệt các phần tử của danh sách.
public ListIterator<E> listIterator()
// Trả về đối tượng ListIterator,
// để duyệt các phần tử từ vị trí có chỉ số 'index' đến cuối danh sách.
public ListIterator<E> listIterator(int index)
package org.o7planning.tutorial.javacollection.list;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListAndListIterator {
public static void main(String[] args) {
// Tạo một đối tượng List (Chỉ chứa các String).
List<String> list = new ArrayList<String>();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
// Lấy ra đối tượng ListIterator để duyệt các phần tử của danh sách.
// (Theo đúng trình tự).
// Returns a list iterator over the elements in this list
// (in proper sequence)
ListIterator<String> listIterator = list.listIterator();
// Hiện tại con trỏ đang đứng tại ví trí đầu tiên của Iterator.
// Đứng tại vị trí có chỉ số 0.
// Lấy ra phần tử đầu tiên trong Iterator, con trỏ tiến thêm một bước.
String first = listIterator.next();
System.out.println("first:" + first);// -->"One"
// Hiện tại con trỏ đang đứng tại vị trí có chỉ số 1.
// Lấy ra phần tử tiếp theo.
String second = listIterator.next();
System.out.println("second:" + second);// -->"Two"
// Kiểm tra xem con trỏ có thể nhẩy lùi trở lại 1 vị trí hay không.
if (listIterator.hasPrevious()) {
// Nhẩy trở lại 1 bước.
String value = listIterator.previous();
System.out.println("value:" + value);// -->"Two"
}
System.out.println(" ----- ");
while (listIterator.hasNext()) {
String value = listIterator.next();
System.out.println("value:" + value);
}
}
}
first:One
second:Two
value:Two
-----
value:Two
value:Three
value:Four
- Mô tả một tập hợp không cho phép chứa các phần tử trùng lặp
- Có cho phép phần tử null, nếu có phần tử null thì chỉ có 1.
package org.o7planning.tutorial.javacollection.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
// Tạo một đối tượng Set có sức chứa (capacity) ban đầu 10 phần tử.
// Nếu số lượng phần tử thêm vào vượt quá sức chứa hiện tại
// nó sẽ tự tăng sức chứa lên 80%.
// Đặc điểm của HashSet là phần tử thêm vào sau sẽ đứng ở phía trước.
Set<String> set = new HashSet<String>(10, (float) 0.8);
set.add("One");
set.add("Two");
// Khi trùng lặp xẩy ra.
// Với HashSet: Nó sẽ thêm vào phần tử mới và loại bỏ phần tử cũ.
set.add("One");
set.add("Three");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
One
Two
Three
- Là tập hợp cho phép các phần tử trùng lặp.
- Không cho phép phần tử null.
- java.util.LinkedList
- java.util.PriorityQueue
PriorityQueue lưu trữ các phần tử trong nội bộ theo trật tự tự nhiên của các phần tử (nếu các phần tử này là kiểu Comparable), hoặc theo một Comparator (bộ so sánh) được sét đặt cho PriorityQueue.
Ném ra ngoại lệ | Trả về giá trị cụ thể | |
Trèn | add(e) | offer(e) |
Loại bỏ | remove() | poll() |
Xem xét | element() | peek() |
package org.o7planning.tutorial.javacollection.queue;
import java.util.LinkedList;
import java.util.Queue;
public class QueueDemo {
public static void main(String[] args) {
Queue<String> names = new LinkedList<String>();
// offer(E): Trèn thêm phần tử vào hàng đợi (queue).
// Với hàng đợi LinkedList phần tử sẽ được trèn vào cuối hàng đợi.
// Trả về true nếu trèn thành công.
// Trả về false nếu hàng đợi không còn chỗ.
names.offer("E");
names.offer("A");
names.offer("M");
// add(E): Trèn thêm phần tử vào hàng đợi.
// Với hàng đợi LinkedList phần tử sẽ trèn vào cuối hàng đợi.
// Trả về true nếu thêm thành công
// Ném ra ngoại lệ nếu hàng đợi không còn chỗ.
names.add("G");
names.add("B");
while (true) {
// Lấy ra và loại bỏ phần tử đầu tiên ra khỏi hàng đợi.
// Trả về null nếu không còn phần tử nào trong hàng đợi.
String name = names.poll();
if (name == null) {
break;
}
System.out.println("Name=" + name);
}
}
}
Name=E
Name=A
Name=M
Name=G
Name=B
package org.o7planning.tutorial.javacollection.queue;
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueDemo {
public static void main(String[] args) {
// Với hàng đợi (queue) PriorityQueue phần tử sẽ được sắp xếp vị trí
// theo trật tự tự nhiên của chúng.
Queue<String> names = new PriorityQueue<String>();
// offer(E): Trèn thêm phần tử vào hàng đợi (queue).
// Trả về true nếu thêm thành công.
// Trả về false nếu hàng đợi không còn chỗ.
names.offer("E");
names.offer("A");
names.offer("M");
// add(E): Trèn một phần tử vào hàng đợi (queue).
// Trả về true nếu thành công.
// Ném ra một Exception nếu hàng đợi đã đầy.
names.add("G");
names.add("B");
while (true) {
// poll(): Lấy ra và loại bỏ phần tử đầu tiên ra khỏi hàng đợi.
// Trả về null nếu không còn phần tử nào trong hàng đợi.
String name = names.poll();
if (name == null) {
break;
}
System.out.println("Name=" + name);
}
}
}
Name=A
Name=B
Name=E
Name=G
Name=M
Implementations | |||||||
Hash Table | Resizable Array | Balanced Tree | Linked List | Hash Table + Linked List | |||
Interfaces | Set | HashSet | TreeSet | LinkedHashSet | |||
Interfaces | List | ArrayList |
package org.o7planning.tutorial.javacollection.list;
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// Khai báo một đối tượng ArrayList chứa các phần tử có kiểu Integer.
ArrayList<Integer> list = new ArrayList<Integer>(10);
// Thêm vào các phần tử.
list.add(123);
list.add(245);
list.add(new Integer(345));
// ArrayList cho phép thêm vào phần tử null .
// (Đặc tính của List)
list.add(null);
// In ra số phần tử trong ArrayList.
System.out.println("Size:" + list.size());// =4
// Truy cập ngẫu nhiên vào phần tử tại chỉ số 1.
Integer i = list.get(1);
System.out.println("Element index 1 =" + i);// =245
Integer newInt = 1000;
// Thay thế phần tử tại vị trí có chỉ số 1.
// Phương thức này trả về phần tử cũ.
Integer old = list.set(1, newInt);
//
System.out.println("Old value:" + old);// =245 .
System.out.println("New value:" + list.get(1));// =1000 .
}
}
Size:4
Element index 1 =245
Old value:245
New value:1000
Các method của Vector được đồng bộ hóa, vì vậy sử dụng tốt trong các ứng dụng đa luồng (Multiple Thread)
// Method di sản từ 1.0 , lấy ra phần tử tại vị trí index
// elementAt(int) giống với method get(int)
public E elementAt(int index)
// Method thừa kế từ interface List, lấy ra phần tử tại vị trí index.
public E get(int index)
// Thay thế phần tử tại vị trí index bởi phần tử mới, và trả về phần tử cũ.
// setElementAt(int,E) giống với set(int,E)
public void setElementAt(int index, E element);
// Thay thế phần tử tại vị trí index bởi phần tử mới, và trả về phần tử cũ.
public E set(int index, E element)
package org.o7planning.tutorial.javacollection.list;
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
// Khởi tạo một đối tượng Vector.
// Với sức chứa (capacity) ban đầu là 10 phần tử.
// Tự động tăng sức chứa thêm 5 nếu số phần tử nhiều hơn
// sức chứa hiện tại.
Vector<Integer> v = new Vector<Integer>(10, 5);
v.add(123);
v.add(245);
v.add(new Integer(345));
v.add(null);
// In ra số phần tử thực sự có trong Vecter (Không phải là sức chứa)
System.out.println("Size:" + v.size());// =4
// Lấy ra phần tử tại chỉ số 1.
// Giống với phương thức get(int).
Integer i = v.elementAt(1);
System.out.println("v.elementAt(1)=" + i);// 245
// Thay thế phần tử tại chỉ số 1.
// Replace element at index 1.
v.setElementAt(1000, 1);
//
System.out.println("New value:" + v.get(1));// =1000 .
}
}
Size:4
v.elementAt(1)=245
New value:1000
Chính vì vậy các phần tử của tập hợp phải so sánh được với nhau, chúng phải là đối tượng của java.lang.Comparable (Có thể so sánh được), Nếu bạn thêm vào tập hợp một phần tử không phải đối tượng của Comparable, bạn sẽ nhận một ngoại lệ.
Các Player có thể so sánh với nhau theo nguyên tắc:
- Ai nhiều huy chương vàng hơn thứ hạng cao hơn.
- Nếu hai người cùng số huy chương vàng, thì ai nhiều huy chương bạc hơn sẽ xếp thứ hạng cao hơn.
- Nếu hai người cùng số huy chương vàng, bạc, thì ai nhiều huy chương đồng hơn sẽ xếp thứ hạng cao hơn.
- Còn lại coi là cùng thứ hạng.
package org.o7planning.tutorial.javacollection.sortedset;
public class Player implements Comparable<Player> {
private String name;
private int goldMedal;
private int silverMedal;
private int bronzeMedal;
public Player(String name, int goldMedal, int silverMedal, int bronzeMedal) {
this.name = name;
this.goldMedal = goldMedal;
this.silverMedal = silverMedal;
this.bronzeMedal = bronzeMedal;
}
// So sánh Player này với Player khác (other).
// Giá trị trả về < 0 nghĩa là Player này < Player other.
// Nếu giá trị trả về > 0 nghĩa là Player này > Player other
// Nếu giá trị trả về = 0 nghĩa là Player này = Player other.
@Override
public int compareTo(Player other) {
// So sánh số huy chương vàng.
int value = this.goldMedal - other.goldMedal;
if (value != 0) {
return value;
}
// So sánh số huy chương bạc.
value = this.silverMedal - other.silverMedal;
if (value != 0) {
return value;
}
// So sánh số huy chương đồng.
value = this.bronzeMedal - other.bronzeMedal;
return value;
}
@Override
public String toString() {
return "[" + this.name + ", Gold: " + this.goldMedal //
+ ", Silver: " + this.silverMedal + ", Bronze: " //
+ this.bronzeMedal + "]";
}
}
package org.o7planning.tutorial.javacollection.sortedset;
import java.util.SortedSet;
import java.util.TreeSet;
public class SortedSetDemo {
public static void main(String[] args) {
// Tạo một đối tượng SortedSet thông qua lớp con TreeSet
SortedSet<Player> players = new TreeSet<Player>();
Player tom = new Player("Tom", 1, 3, 5);
Player jerry = new Player("Jerry", 3, 1, 3);
Player donald = new Player("Donal", 2, 10, 0);
// Thêm các phần tử vào tập hợp.
// Chúng sẽ tự động được sắp xếp (Tăng dần).
players.add(tom);
players.add(jerry);
players.add(donald);
// In ra các phần tử.
for (Player player : players) {
System.out.println("Player: " + player);
}
}
}
Player: [Tom, Gold: 1, Silver: 3, Bronze: 5]
Player: [Donal, Gold: 2, Silver: 10, Bronze: 0]
Player: [Jerry, Gold: 3, Silver: 1, Bronze: 3]
6. Nhóm Map
TT | Phương thức và mô tả |
1 | void clear( ) Loại bỏ tất cả các cặp key/value ra khỏi map.(optional operation). |
2 | boolean containsKey(Object k) Trả về true nếu trong map có chứa khóa cho bởi tham số, ngược lại trả về false. |
3 | boolean containsValue(Object v) Trả về true nếu map chứa giá trị cho bởi tham số, ngược lại trả về false. |
4 | Set<Map.Entry<K,V>> entrySet( ) Trả về đối tượng Set chứa các entry của map. Nó là tập hợp các đối tượng có kiểu Map.Entry. |
5 | boolean equals(Object obj) Trả về true nếu obj là một Map và chứa cùng các entry, ngược lại trả về false. |
6 | Object get(K k) Trả về giá trị tương ứng với khóa. |
7 | int hashCode( ) Trả về hashCode |
8 | boolean isEmpty( ) Trả về true nếu map không có phần tử, ngược lại trả về false. |
9 | Set<K> keySet( ) Trả về đối tượng Set chứa các khóa của map. |
10 | Object put(K k, V v) Đặt một cặp key/value vào map, nó sẽ ghi đè giá trị mới nếu khóa đã tồn tại trong map. Nếu khóa đã tồn tại trong map, phương thức trả về giá trị cũ ứng với khóa, ngược lại trả về null.(optional operation). |
11 | void putAll(Map<? extends K,? extends V> m) Đặt hết tất cả các cặp key/value trong m vào map này.(optional operation). |
12 | Object remove(Object k) Loại bỏ cặp key/value ứng với khóa cho bởi tham số. (optional operation). |
13 | int size( ) Trả về số lượng các cặp key/value trong map. |
14 | Collection values( ) Trả về một tập hợp chứa các giá trị trong map. |
import java.util.Collection;
import java.util.Map;
import java.util.Set;
public class MyMap<K,V> implements Map<K,V>{
.....
// Nếu bạn gọi phương thức này, một ngoại lệ sẽ được ném ra vô điều kiện.
@Override
public void clear() {
throw new java.lang.UnsupportedOperationException();
}
}
package org.o7planning.tutorial.javacollection.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("01000005", "Tom");
map.put("01000002", "Jerry");
map.put("01000003", "Tom");
map.put("01000004", "Donald");
// Lấy ra một tập hợp chứa các khóa (key).
// Tập hợp này không được sắp xếp.
Set<String> phones = map.keySet();
for (String phone : phones) {
System.out.println("Phone: " + phone + " : " + map.get(phone));
}
}
}
Phone: 01000004 : Donald
Phone: 01000003 : Tom
Phone: 01000005 : Tom
Phone: 01000002 : Jerry
package org.o7planning.tutorial.javacollection.map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class MapEntryDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("01000005", "Tom");
map.put("01000002", "Jerry");
map.put("01000003", "Tom");
map.put("01000004", "Donald");
// Lấy ra một tập hợp của các entry.
// Các entry này có thể không được sắp xếp theo khóa (key).
Set<Entry<String, String>> entries = map.entrySet();
for (Entry<String, String> entry : entries) {
System.out.println("Phone: " + entry.getKey() + " : " + entry.getValue());
}
}
}
Phone: 01000004 : Donald
Phone: 01000003 : Tom
Phone: 01000005 : Tom
Phone: 01000002 : Jerry
TT | Phương thức và mô tả |
1 | Comparator comparator( ) Trả về bộ so sánh (Comparator) sử dụng để sắp xếp. Nếu thứ tự tự nhiên được sử dụng cho map (key implements Comparable), null sẽ được trả về. |
2 | Object firstKey( ) Trả về key đầu tiên trong map. |
3 | SortedMap headMap(Object end) Trả về một SortedMap con, với các cặp key/value mà key được đánh giá nhỏ hơn hoặc bằng end. |
4 | Object lastKey( ) Trả về key cuối cùng. |
5 | SortedMap subMap(Object start, Object end) Trả về một SortedMap con, chứa các cặp key/value mà key được đánh giá lớn hơn hoặc bằng start và nhỏ hơn hoặc bằng end. |
6 | SortedMap tailMap(Object start) Trả về một SortedMap con, chứa các cặp key/value mà key của nó được đánh giá lớn hơn hoặc bằng start. |
package org.o7planning.tutorial.javacollection.sortedmap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class SortedMapDemo {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>();
map.put("01000005", "Tom");
map.put("01000002", "Jerry");
map.put("01000003", "Tom");
map.put("01000004", "Donald");
// Tập hợp này đã được sắp xếp tăng dần.
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println("Phone: " + key);
}
System.out.println("-----");
// Tập hợp này cũng đã được sắp xếp theo key.
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println("Phone: " + entry.getKey());
}
}
}
Phone: 01000002
Phone: 01000003
Phone: 01000004
Phone: 01000005
-----
Phone: 01000002
Phone: 01000003
Phone: 01000004
Phone: 01000005
Các hướng dẫn Java Collections Framework
- Hướng dẫn và ví dụ Java PriorityBlockingQueue
- Hướng dẫn sử dụng nền tảng tập hợp trong Java (Java Collection Framework)
- Hướng dẫn và ví dụ Java SortedSet
- Hướng dẫn và ví dụ Java List
- Hướng dẫn và ví dụ Java Iterator
- Hướng dẫn và ví dụ Java NavigableSet
- Hướng dẫn và ví dụ Java ListIterator
- Hướng dẫn và ví dụ Java ArrayList
- Hướng dẫn và ví dụ Java CopyOnWriteArrayList
- Hướng dẫn và ví dụ Java LinkedList
- Hướng dẫn và ví dụ Java Set
- Hướng dẫn và ví dụ Java TreeSet
- Hướng dẫn và ví dụ Java CopyOnWriteArraySet
- Hướng dẫn và ví dụ Java Queue
- Hướng dẫn và ví dụ Java Deque
- Hướng dẫn và ví dụ Java IdentityHashMap
- Hướng dẫn và ví dụ Java WeakHashMap
- Hướng dẫn và ví dụ Java Map
- Hướng dẫn và ví dụ Java SortedMap
- Hướng dẫn và ví dụ Java NavigableMap
- Hướng dẫn và ví dụ Java HashMap
- Hướng dẫn và ví dụ Java TreeMap
- Hướng dẫn và ví dụ Java PriorityQueue
- Hướng dẫn và ví dụ Java BlockingQueue
- Hướng dẫn và ví dụ Java ArrayBlockingQueue
- Hướng dẫn và ví dụ Java TransferQueue