1. Phương thức làm việc với Ngày tháng
1. Lớp Date
Lấy ngày giờ hiện tại và số mili giây tương ứng
public class LopDateTest {
/*
Lớp Date
*/
@Test
public void kiemTraDate(){
/*
Gói: java.util.Date
*/
Date ngayHienTai = new Date();//Lấy ngày giờ hiện tại
System.out.println(ngayHienTai);
//Lấy số mili giây hiện tại
long soMiliGiay = ngayHienTai.getTime();//Số mili giây - 1712888846161 Fri Apr 12 10:27:26 CST 2024
System.out.println(soMiliGiay);
Date ngayTuMiliGiay = new Date(1712888846161L);//Lấy ngày giờ từ số mili giay
System.out.println(ngayTuMiliGiay);
}
/*
SimpleDateFormat : Định dạng ngày giờ theo yêu cầu
*/
@Test
public void kiemTraFormat() throws ParseException {
//Truyền định dạng vào constructor
SimpleDateFormat dinhDangNgay = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//Chuyển ngày giờ thành chuỗi (theo định dạng đã chọn)
String chuoiNgay = dinhDangNgay.format(new Date());
System.out.println(chuoiNgay);
//2024-04-12 10:34:06
//Chuyển chuỗi thành Date
//Lưu ý: Định dạng chuỗi phải khớp với định dạng trong constructor
Date ngay = dinhDangNgay.parse("2024-04-12 10:34:06");
System.out.println(ngay);
}
}
2. LocalDate, LocalTime, LocalDateTime
package com.vietpro.java;
import org.junit.Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
/*
LocalDate : Ngày
LocalTime : Thời gian
LocalDateTime : Ngày và thời gian
*/
public class LopDateTimeTest {
@Test
public void kiemTra(){
LocalDate ngayHienTai = LocalDate.now(); //Ngày hiện tại
LocalTime thoiGianHienTai = LocalTime.now(); //Thời gian hiện tại
LocalDateTime ngayGioHienTai = LocalDateTime.now();//Ngày và thời gian hiện tại
System.out.println(ngayHienTai);
System.out.println(thoiGianHienTai);
System.out.println(ngayGioHienTai);
System.out.println("===============================================");
//Tạo đối tượng ngày chỉ định
LocalDate ngayChiDinh = LocalDate.of(2022, 10, 10);
System.out.println(ngayChiDinh);
//Tạo đối tượng thời gian chỉ định
LocalTime thoiGianChiDinh = LocalTime.of(12, 10, 10, 200);
System.out.println(thoiGianChiDinh);
}
@Test
public void kiemTra2(){
LocalDateTime hienTai = LocalDateTime.now();
//Ngày trong tháng hiện tại
int ngayTrongThang = hienTai.getDayOfMonth();
//Lấy tháng hiện tại
Month thang = hienTai.getMonth();
System.out.println(ngayTrongThang);
System.out.println(thang);
System.out.println("------------------------------------");
//Cộng 1 ngày vào ngày hiện tại --- Không sửa ngày gốc (tạo ngày mới)
LocalDateTime ngayMoi = hienTai.plusDays(1);
System.out.println(ngayMoi);
//Cộng 2 ngày vào ngày hiện tại --- Không sửa ngày gốc (tạo ngày mới)
LocalDateTime ngayMoi2 = hienTai.plusDays(2);
System.out.println(ngayMoi2);
}
@Test
public void kiemTra3(){
/*
| isBefore()/isAfter() | So sánh hai LocalDate |
isLeapYear() | Kiểm tra năm nhuận (được khai báo trong lớp LocalDate) |
*/
LocalDate hienTai = LocalDate.now();
System.out.println(hienTai.getYear() + " : " + (hienTai.isLeapYear()? "Là năm nhuận" : "Là năm thường"));
System.out.println("------------------------------------");
LocalDate ngay1 = LocalDate.of(2022, 10, 3);
LocalDate ngay2 = LocalDate.of(2021, 8, 9);
System.out.println(ngay1.isAfter(ngay2));
}
}
3. SimpleDateFormat và DateTimeFormatter
package com.vietpro.java;
import org.junit.Test;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
/*
DateTimeFormatter : Định dạng ngày giờ - Định dạng để có được định dạng mong muốn
*/
public class LopDateTimeFormatterTest {
@Test
public void kiemTra(){
//Lấy ngày giờ hiện tại
LocalDateTime hienTai = LocalDateTime.now();
//Cách chuyển đổi thứ nhất
DateTimeFormatter dinhDang = DateTimeFormatter.ISO_DATE;
String chuoi = dinhDang.format(hienTai);//Định dạng ngày giờ
System.out.println(chuoi);
System.out.println("==================================");
//Cách chuyển đổi thứ hai
DateTimeFormatter dinhDang2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
String chuoi2 = dinhDang2.format(hienTai);//Định dạng ngày giờ
System.out.println(chuoi2);
System.out.println("==================================");
//Cách chuyển đổi thứ ba : Tùy chỉnh
DateTimeFormatter dinhDang3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//Chuyển ngày giờ thành chuỗi
String chuoi3 = dinhDang3.format(hienTai);
//Chuyển chuỗi thành ngày giờ
TemporalAccessor doiTuongNgay = dinhDang3.parse("2024-04-12 14:58:58");
System.out.println(chuoi3);
}
}
2. Công cụ làm việc với Mảng
1. Lớp tiện ích
package com.vietpro.java2;
import org.junit.Test;
import java.util.Arrays;
/*
Lớp tiện ích cho mảng : Arrays
*/
public class LopArraysTest {
/*
toString : Ghép các phần tử trong mảng thành một chuỗi
*/
@Test
public void kiemTra(){
int[] mangSo = {1,2,3,4,5};
//Ghép các phần tử trong mảng thành một chuỗi
String chuoi = Arrays.toString(mangSo);
System.out.println(chuoi);
}
/*
sort : Sắp xếp các phần tử trong mảng
*/
@Test
public void kiemTra2(){
int[] mangSo = {5,2,1,3,9};
// Sắp xếp các phần tử trong mảng : Vì là kiểu tham chiếu nên không cần trả về giá trị
Arrays.sort(mangSo);
System.out.println(Arrays.toString(mangSo));
}
@Test
public void kiemTra22(){
int[] mangSo = {5,2,1,3,9,4,8,6};
//static void sort(int[] a, int fromIndex, int toIndex) : Sắp xếp phần tử mảng a từ [fromIndex, toIndex) theo thứ tự tăng dần
//Lưu ý: Không bao gồm toIndex
Arrays.sort(mangSo,0,3);
System.out.println(Arrays.toString(mangSo));
}
/*
Tìm nhị phân trong mảng
static int binarySearch(int[] a, int key)
Lưu ý: Điều kiện là mảng phải được sắp xếp
*/
@Test
public void kiemTra3(){
int[] mangSo = {5,2,1,3,9,4,8,6,7};
//Sắp xếp
Arrays.sort(mangSo);
System.out.println(Arrays.toString(mangSo));
//Tìm - Kết quả tìm là vị trí sau khi sắp xếp. Nếu không tìm thấy trả về số âm
System.out.println(Arrays.binarySearch(mangSo,4));
}
/*
* static int[] copyOf(int[] original, int newLength) : Tạo một mảng mới có độ dài newLength dựa trên mảng gốc original và trả về mảng mới
*
* //Đây là phương thức generic -- Sẽ giải thích sau (Hiểu ở đây T là bất kỳ kiểu dữ liệu nào -- nhưng không phải kiểu dữ liệu nguyên thủy)
* static <T> T[] copyOf(T[] original,int newLength): Tạo một mảng mới có độ dài newLength dựa trên mảng gốc original và trả về mảng mới
*
*/
@Test
public void kiemTra4(){
int[] mangSo = {1,2,3};
//Mở rộng mảng - ①Tạo mảng mới ②Sao chép nội dung từ mảng gốc vào mảng mới
int[] mangMoi = Arrays.copyOf(mangSo, 6);
System.out.println(Arrays.toString(mangMoi));
System.out.println("==========================================");
String[] chuoiMang = {"aa","bbb"};
Arrays.copyOf(chuoiMang,20);
}
/*
* static int[] copyOfRange(int[] original, int from, int to) : Tạo mảng mới từ phần tử [from,to) của mảng original và trả về mảng mới
* Lưu ý: Không bao gồm vị trí to
* static <T> T[] copyOfRange(T[] original,int from,int to): Tạo mảng mới từ phần tử [from,to) của mảng original và trả về mảng mới
*/
@Test
public void kiemTra5(){
int[] mangSo = {5,2,1,3,9,4,8,6,7};
int[] mangSoMoi = Arrays.copyOfRange(mangSo, 0, 3);
System.out.println(Arrays.toString(mangSoMoi));
}
/*
* static boolean equals(int[] a, int[] a2) : So sánh độ dài và các phần tử của hai mảng có giống nhau không
* So sánh nội dung (số lượng phần tử, nội dung phần tử)
* static boolean equals(Object[] a,Object[] a2): So sánh độ dài và các phần tử của hai mảng có giống nhau không
*/
@Test
public void kiemTra6(){
int[] mangSo = {5,2,1,3,9,4,8,6};
int[] mangSo2 = {5,2,1,3,9,4,8,5};
System.out.println(Arrays.equals(mangSo,mangSo2));
}
/*
* static void fill(int[] a, int val) : Điền giá trị val vào toàn bộ mảng a
* static void fill(Object[] a,Object val): Điền đối tượng val vào toàn bộ mảng a
* static void fill(int[] a, int fromIndex, int toIndex, int val): Điền giá trị val vào phần [fromIndex,toIndex) của mảng a
* static void fill(Object[] a, int fromIndex, int toIndex, Object val) : Điền đối tượng val vào phần [fromIndex,toIndex) của mảng a
*/
@Test
public void kiemTra7(){
int[] mangSo = {5,2,1,3,9,4,8,6};
Arrays.fill(mangSo,100);
System.out.println(Arrays.toString(mangSo));
}
}
2. Chèn và xóa phần tử trong mảng
package com.vietpro.java2;
import org.junit.Test;
import java.util.Arrays;
/*
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :
src: Mảng nguồn (copy từ mảng nguồn)
srcPos: Vị trí bắt đầu copy trong mảng nguồn
dest: Mảng đích (copy nội dung từ mảng nguồn vào mảng đích)
destPos: Vị trí bắt đầu copy trong mảng đích
length: Độ dài nội dung cần copy
Copy một mảng từ mảng nguồn, bắt đầu từ vị trí chỉ định, đến vị trí chỉ định trong mảng đích. Thường dùng để chèn và xóa phần tử trong mảng
*/
public class LopSystemArrayTest {
@Test
public void kiemTra(){
int[] mangSo = {1,2,3,4,5,6};
int[] mangSoMoi = new int[10];
System.arraycopy(mangSo,2,mangSoMoi,2,3);
System.out.println(Arrays.toString(mangSoMoi));
}
}
3. Bài tập thực hành
package com.vietpro.java2;
import java.util.Arrays;
public class LopMangTest {
public static void main(String[] args) {
GioHang gioHang = GioHang.getInstance();
gioHang.themVaoGio("Điện thoại Samsung S23");
gioHang.themVaoGio("Laptop Dell XPS");
gioHang.themVaoGio("Tai nghe Sony WH-1000XM4");
gioHang.themVaoGio("Đồng hồ Apple Watch");
gioHang.themVaoGio("Máy tính bảng iPad");
GioHang gioHang2 = GioHang.getInstance();
gioHang2.xoaSanPham(2);
GioHang gioHang3 = GioHang.getInstance();
gioHang3.capNhatSanPham(1,"Tai nghe Sony WH-1000XM5");
gioHang3.hienThiGioHang();
}
}
class GioHang{
//Mảng chứa sản phẩm - String[]
private String[] gioHang = new String[3];
private int dem = 0;
private GioHang(){}
private final static GioHang instance = new GioHang();
public static GioHang getInstance(){
return instance;
}
public void themVaoGio(String sanPham){
//Kiểm tra mảng đã đầy chưa
if (dem >= gioHang.length){
//Mảng đầy - Mở rộng
/*
Thực hiện 3 việc
1. Tạo mảng mới có độ dài : Độ dài mảng cũ * 2
2. Sao chép nội dung từ mảng cũ vào mảng mới
3. Gán mảng mới cho tham chiếu của mảng cũ
*/
gioHang = Arrays.copyOf(gioHang,gioHang.length * 2);
}
//Thêm sản phẩm vào mảng - Xử lý trường hợp mảng đầy
gioHang[dem] = sanPham;
dem++;
}
public void xoaSanPham(int viTri){
//Kiểm tra vị trí có sản phẩm không
if (viTri >=0 && viTri < dem) {
//Xóa có phải là sản phẩm cuối cùng không
if (viTri == dem - 1){
//Đặt vị trí cuối cùng thành null
gioHang[dem - 1] = null;
}else {
//Xóa sản phẩm khỏi mảng
System.arraycopy(gioHang, viTri + 1, gioHang, viTri, dem - viTri - 1);
//Đặt vị trí cuối cùng thành null
gioHang[dem - 1] = null;
}
dem--;//Giảm số lượng sản phẩm đi 1
}else{//Vị trí không hợp lệ
throw new ViTriKhongHopLeException("Không có sản phẩm này");
}
}
public void capNhatSanPham(int viTri, String sanPhamMoi){
//Kiểm tra vị trí có sản phẩm không
if (viTri >=0 && viTri < dem) {
//Cập nhật sản phẩm
gioHang[viTri] = sanPhamMoi;
}else{
throw new ViTriKhongHopLeException("Không có sản phẩm này");
}
}
public void hienThiGioHang(){
if (dem == 0) {
System.out.println("Giỏ hàng trống");
}else {
//Hiển thị tất cả sản phẩm
for (int i = 0; i < dem; i++) {
System.out.println(gioHang[i]);
}
}
}
}
class ViTriKhongHopLeException extends RuntimeException {
public ViTriKhongHopLeException(String message) {
super(message);
}
}
4. So sánh phần tử mảng
package com.vietpro.java3;
import java.util.Arrays;
public class LopSoSanhTest {
public static void main(String[] args) {
Sach[] sachList = new Sach[4];
sachList[0] = new Sach("Java căn bản",150000,45);
sachList[1] = new Sach("Lập trình hướng đối tượng",120000,32);
sachList[2] = new Sach("Cơ sở dữ liệu",135000,28);
sachList[3] = new Sach("Mạng máy tính",180000,51);
sapXep(sachList);
System.out.println(Arrays.toString(sachList));
}
public static void sapXep(Sach[] sachList){
for (int i = 0; i < sachList.length - 1; i++) {
for (int j = 0; j < sachList.length - i - 1; j++) {
if (sachList[j].soSanh(sachList[j + 1]) > 0){
Sach temp = sachList[j];
sachList[j] = sachList[j+1];
sachList[j+1] = temp;
}
}
}
}
}
/*
Sắp xếp tự nhiên : Comparable
Lợi ích : Không cần sửa thuật toán sắp xếp.
Muốn sắp xếp đối tượng nào chỉ cần lớp của đối tượng đó triển khai interface Comparable và ghi đè phương thức compareTo
Trong phương thức compareTo thực hiện cách sắp xếp (sắp xếp theo thuộc tính nào) là được
*/
class Sach implements Comparable{
String tenSach;
int gia;
//Số lượng bán
int soLuongBan;
public Sach(String tenSach, int gia, int soLuongBan) {
this.tenSach = tenSach;
this.gia = gia;
this.soLuongBan = soLuongBan;
}
@Override
public String toString() {
return tenSach + " " + gia + " " + soLuongBan;
}
/*
So sánh nội dung
Giá trị trả về:
Số dương: Giá của đối tượng hiện tại lớn hơn giá đối tượng truyền vào
Số âm: Giá của đối tượng hiện tại nhỏ hơn giá đối tượng truyền vào
0 : Giá của đối tượng hiện tại bằng giá đối tượng truyền vào
*/
@Override
public int compareTo(Object o) {
if (!(o instanceof Sach) || o == null){
throw new RuntimeException("Loại không khớp");
}
//Ép kiểu xuống
Sach sachKhac = (Sach) o;
return this.gia - sachKhac.gia;
// return this.soLuongBan - sachKhac.soLuongBan;
}
}
5. Sắp xếp tự nhiên
package com.vietpro.java4;
import java.util.Arrays;
import java.util.Comparator;
public class LopBoSoSanhTest {
public static void main(String[] args) {
Sach[] sachList = new Sach[4];
sachList[0] = new Sach("Java căn bản",150000,45);
sachList[1] = new Sach("Lập trình hướng đối tượng",120000,32);
sachList[2] = new Sach("Cơ sở dữ liệu",135000,28);
sachList[3] = new Sach("Mạng máy tính",180000,51);
/*
sapXep(sachList, new Comparator() { //Tạo đối tượng lớp nặc danh
@Override
public int compare(Object o1, Object o2) {
if (!(o1 instanceof Sach) || !(o2 instanceof Sach)){
throw new RuntimeException("Loại không đúng");
}
//Ép kiểu xuống
Sach sach1 = (Sach) o1;
Sach sach2 = (Sach) o2;
return sach1.gia - sach2.gia;//Sắp xếp theo giá
}
});
*/
sapXep(sachList, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//Ép kiểu xuống
Sach sach1 = (Sach) o1;
Sach sach2 = (Sach) o2;
return sach1.soLuongBan - sach2.soLuongBan;//Sắp xếp theo số lượng bán
}
});
System.out.println(Arrays.toString(sachList));
}
/*
public interface Comparator<T> {
int compare(T o1, T o2);
}
*/
//Gán đối tượng lớp triển khai interface Comparator cho interface Comparator Đa hình
public static void sapXep(Sach[] sachList, Comparator c){
for (int i = 0; i < sachList.length - 1; i++) {
for (int j = 0; j < sachList.length - i - 1; j++) {
//Gọi phương thức compare là gọi phương thức triển khai của lớp triển khai interface
if (c.compare(sachList[j],sachList[j+1]) > 0){
Sach temp = sachList[j];
sachList[j] = sachList[j+1];
sachList[j+1] = temp;
}
}
}
}
}
class Sach{
String tenSach;
int gia;
//Số lượng bán
int soLuongBan;
public Sach(String tenSach, int gia, int soLuongBan) {
this.tenSach = tenSach;
this.gia = gia;
this.soLuongBan = soLuongBan;
}
@Override
public String toString() {
return tenSach + " " + gia + " " + soLuongBan;
}
}