1. Trang chủ
  2. » Luận Văn - Báo Cáo

đồ án môn học công nghệ java đề tài báo cáo bài tập lớn tuần 1

108 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Báo cáo Bài tập Lớn Tuần 1
Tác giả Trịnh Xuân Bách, Nguyễn Văn Đạt, Lê Trung Hiếu, Trần Quý Đỉnh, Nguyễn Văn Hào
Người hướng dẫn TS. Trần Trung
Trường học Trường Đại học Kiến trúc Hà Nội
Chuyên ngành Công nghệ Java
Thể loại Đồ án môn học
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 108
Dung lượng 1,91 MB

Cấu trúc

  • CHƯƠNG 1: THỰC HIỆN CÀI ĐẶT OPEN JDK 17 VÀ NỀN TẢNG LẬP TRÌNH ECLIPSE TRÊN UBUNTU LINUX (6)
    • 1.1. Cài đặt chương trình máy ảo VMware và Ubuntu Linux (6)
    • 1.2. Cài đặt OPEN JDK17 (10)
    • 1.3. Cài đặt nền tảng lập trình Eclipse (12)
  • CHƯƠNG 2: BIÊN DỊCH SANG TIẾNG VIỆT BOOK 4 CUỐN “JAVA ALL-IN- (15)
    • 2.1. Biên dịch sang tiếng việt Chương 1 (15)
    • 2.2. Biên dịch sang tiếng việt Chương 2 (28)
    • 2.3. Biên dịch sang tiếng việt Chương 3 (52)
    • 2.4. Biên dịch sang tiếng việt Chương 4 (63)
    • 2.5. Biên dịch sang tiếng việt Chương 5 (72)
    • 2.6. Biên dịch sang tiếng việt Chương 6 (83)
  • CHƯƠNG 3: THỰC HIỆN BÀI TẬP BẰNG JAVA (90)

Nội dung

Sau đó, phương thức này trả về đối tượng mới như giá trị trả vềcủa mình.Bạn có thể kết hợp hoặc nối chuỗi bằng cách sử dụng toán tử +, như sau:String line2 = line1 + “\nOh what a beautif

THỰC HIỆN CÀI ĐẶT OPEN JDK 17 VÀ NỀN TẢNG LẬP TRÌNH ECLIPSE TRÊN UBUNTU LINUX

Cài đặt chương trình máy ảo VMware và Ubuntu Linux

Bước 1: Chúng ta sẽ chọn vào đường dẫn: https://www.vmware.com/content/vmware/vmware-published-sites/us/products/workstation- pro/workstation-pro-evaluation.html.html

Màn hình sẽ hiển thị ra trang web sau:

Sau đó chúng ta click chọn “DOWNLOAD NOW” của phần “Workstation 17 Pro for Windows” để tải chương trình về.

Bước 2: Sau khi máy tính đã tải xong file cài đặt về, chúng ta vào thư mục “Downloads” của máy tính để kiểm tra file cài đặt và click vào file để được kết quả như hình dưới:

Bước 3: Tiếp tục chọn “Next” cho tới khi thấy “Install” như hình dưới để cài đặt chương trình.

Bước 4: Tiếp tục chọn “Install” và đợi chương trình cài đặt vào máy tính cho tới khi hoàn thành sẽ hiện “Finish” như hình dưới Sau đó chọn “Finish” để kết thúc việc cài đặt chương trình.

Bước 5: Chúng ta chọn vào đường dẫn: https://ubuntu.com/download/desktop/thank-you? version".04.3&architecture=amd64&fbclid=IwAR0P_Dkk2mg6G2yq_WhW7VgS56fhBf5 dV219gLzEQY_ilvLxpMgzwBooysk

File ISO Ubuntu Linux sẽ được máy tính tự động tải về.

Bước 6: Sau khi tải xong file ISO Ubuntu chúng ta sẽ mở chương trình WMware lên và màn hình sẽ hiển thị giao diện chính như hình:

Bước 7: Chúng ta chọn “Create a New Virtual Machine” sau đó chọn “Linux” và version

Bước 8: Sau đó cứ tiếp tục chọn “Next” cho tới khi thấy “Finish” để hoàn thành thiết lập cho chương trình.

Thứ tự thực hiện như sau: Đầu tiên chọn mục "VM", sau đó chọn mục "Settings" rồi chọn mục "Use ISO image file" để dẫn đến file ISO Ubuntu vừa tải về Chọn

“Ok” và chọn “Power on this virtual machine” để chạy chương trình.

Bước 10: Sau khi đợi chương trình cài đặt xong máy tính sẽ hiển thị giao diện chính như hình:

Vậy là chúng ta đã cài đặt xong chương trình máy ảo VMware và Ubuntu Linux.

Cài đặt OPEN JDK17

Bước 1: Từ giao diện chính của Ubuntu Linix chúng ta click chuột phải chọn “Open inTerminal” hoặc nhấn tổ hợp phím “Ctrl + Alt + T” để hiện bảng Teminal như hình:

Bước 2: Từ bảng Terminal chúng ta gõ “java -version” để kiểm tra xem hệ thống đã được cài phiên bản java nào chưa Nếu chưa có sẽ hiện lên dòng lệnh “Command ‘java’ not found, but can be installed with:”

Bước 3: Chúng ta sẽ cài OPEN JDK17 bằng dòng lệnh “sudo apt install openjdk-17-jre- headless” mà hệ thống đã gợi ý như trên và sau đó chờ hệ thống cài đặt.

Bước 4: Sau khi cài đặt xong chúng ta dùng lệnh “java – version” để kiểm tra lại xem hệ thống đã cài đặt java hay chưa Nếu hiển thị như hình dưới tức là đã cài đặt thành công OPEN JDK 17.

Vậy là chúng ta đã cài đặt thành công OPEN JDK 17 trên Ubuntu Linux.

Cài đặt nền tảng lập trình Eclipse

Step 1: Open a web browser on Ubuntu Linux and navigate to the following URL: https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2023-09/R/eclipse-inst-jre-linux64.tar.gz to download the Eclipse installer for Linux.

Bước 2: Sau khi tải xong chúng ta vào thư mục “Download” giải nén file và chọn “eclipse- inst” và chọn “Install” để cài đặt chương trình Ở đây chúng ta dùng phiên bản Enterprise Java and Web Developers.

Bước 3: Sau khi cài đặt xog chọn nơi thực hiện lưu trữ tài liệu và ấn “Launch”.

Bước 4: Cài đặt thành công phần mềm sẽ hiển thị như bên dưới.

Vậy là chúng ta đã cài đặt xong nền tảng lập trình Eclipse trên Ubuntu Linux.

BIÊN DỊCH SANG TIẾNG VIỆT BOOK 4 CUỐN “JAVA ALL-IN-

Biên dịch sang tiếng việt Chương 1

Nội dung trong chương này: ằ Đỏnh giỏ nhanh về những gỡ bạn đó biết về chuỗi ằ Xem xột cỏc phương thức của lớp chuỗi ằ Làm việc với cỏc phần chuỗi ằ Chia chuỗi ằ Sử dụng cỏc lớp StringBuilder và StringBuffer ằ Sử dụng giao diện CharSequence

Chuỗi là phổ biến trong Java, bài viết sau sẽ giới thiệu những kỹ thuật khác nhau khi làm việc với chuỗi Đầu tiên là tạo biến chuỗi, nối chuỗi và sau đó so sánh chuỗi Qua đó, bạn sẽ hiểu khái quát những thao tác cơ bản khi làm việc với chuỗi.

Trong chương này, tôi sẽ đào sâu hơn vào những gì Java có thể làm với chuỗi Tôi bắt đầu bằng một đánh giá ngắn về những gì tôi đã trình bày về chuỗi cho đến nay để bạn không cần phải lật lại cuốn sách để tìm thông tin cơ bản Sau đó, tôi xem xét chính lớp String và một số phương thức mà nó cung cấp để làm việc với chuỗi Cuối cùng, tôi xem xét hai lớp gần như tương tự nhau mang tên StringBuilder và StringBuffer mà cung cấp các tính năng không có sẵn trong lớp String cơ bản cũng như một giao diện mang tên CharSequence được triển khai bởi String, StringBuilder, và StringBuffer. ĐÁNH GIÁ CHUỖI Để giúp bạn tránh sự phiền phức khi phải lật lại cuốn sách này, các đoạn văn sau đây tóm tắt những gì tôi trình bày về chuỗi trong các chương trước:

Chuỗi là kiểu tham chiếu chứa tham chiếu đến đối tượng được tạo từ lớp String, không phải giá trị của chuỗi đó.

Mặc dù chuỗi không phải là kiểu nguyên thủy, nhưng trình biên dịch Java có một số tính năng được thiết kế để cho phép bạn làm việc với chuỗi gần như như chúng là kiểu nguyên thủy.Java cho phép bạn gán các chuỗi chữ số (string literals) cho các biến chuỗi, ví dụ như sau:

String line1 = "Oh what a beautiful morning!";

Chuỗi có thể bao gồm các chuỗi thoát (\escape sequences) gồm dấu gạch chéo tiếp theo một ký tự khác Các chuỗi thoát phổ biến nhất là \n để xuống dòng và \t để tab Nếu bạn muốn bao gồm một dấu gạch chéo trong một chuỗi, bạn phải sử dụng chuỗi thoát \ Dưới đây là một danh sách đầy đủ về tất cả các chuỗi thoát bạn có thể sử dụng:

Chuỗi và ký tự là hai thứ khác nhau Chuỗi chữ số được đánh dấu bằng dấu ngoặc kép; ký tự chữ số được đánh dấu bằng dấu nháy đơn Vì vậy, "a" là một chuỗi chữ số có độ dài chỉ một ký tự Ngược lại, 'a' là một ký tự chữ số.

Nhiều ứng dụng có thể hưởng lợi từ việc sử dụng các lớp mô tả các đối tượng không thể thay đổi Một đối tượng không thể thay đổi là một đối tượng mà khi đã được tạo, không bao giờ có thể được thay đổi Lớp String là ví dụ phổ biến nhất về một đối tượng không thể thay đổi Sau khi bạn tạo một đối tượng String, bạn không thể thay đổi nó.

Giả sử bạn đang thiết kế một trò chơi trong đó bề mặt trò chơi có các vật cản cố định, như cây cỏ Bạn có thể tạo lớp Tree bằng cách sử dụng mô hình Immutable Hàm tạo cho lớp Tree có thể chấp nhận các tham số xác định kích thước, loại và vị trí của cây Nhưng sau khi bạn tạo cây, bạn không thể di chuyển nó.

Tuân theo ba quy tắc đơn giản sau để tạo một đối tượng không thể thay đổi:

• Cung cấp một hoặc nhiều hàm tạo chấp nhận tham số để đặt trạng thái ban đầu của đối tượng.

• Không cho phép bất kỳ phương thức nào sửa đổi bất kỳ biến thể nào của đối tượng Đặt biến thể của đối tượng bằng cách sử dụng hàm tạo và sau đó để nó không bị thay đổi.

• Bất kỳ phương thức nào sửa đổi đối tượng nên làm điều đó bằng cách tạo một đối tượng mới với các giá trị được sửa đổi Sau đó, phương thức này trả về đối tượng mới như giá trị trả về của mình.

Bạn có thể kết hợp hoặc nối chuỗi bằng cách sử dụng toán tử +, như sau:

String line2 = line1 + “\nOh what a beautiful day!”;

Bạn cũng có thể sử dụng toán tử += với chuỗi, như sau: line2 += “\nI’ve got a beautiful feeling”;

Khi một kiểu nguyên thủy được sử dụng trong một biểu thức nối chuỗi, Java tự động chuyển đổi kiểu nguyên thủy thành chuỗi Do đó, Java cho phép các thao tác sau: int empCount = 50;

String msg = "Number of employees: " + empCount;

Các lớp đóng gói nguyên thủy khác nhau (như Integer và Double) có các phương thức parse có thể chuyển đổi các giá trị chuỗi thành kiểu số Dưới đây là một ví dụ:

Không thể so sánh các chuỗi bằng toán tử so sánh (==) Thay vào đó, phương thức equals phải được sử dụng để so sánh chúng Ví dụ: if (lastName.equals("Lowe"))

System.out.println("This is me!");

Lớp String cũng có một phương thức equalsIgnoreCase mà so sánh chuỗi mà không xem xét trường hợp Dưới đây là một ví dụ: if (lastName.equalsIgnoreCase("lowe"))

System.out.println("This is me again!");

Lớp String là lớp bạn sử dụng để tạo đối tượng chuỗi Nó có một loạt các phương thức được thiết kế để cho phép bạn lấy thông tin về chuỗi được biểu diễn bởi lớp String Bảng 1-1 liệt kê những phương thức hữu ích nhất của chúng.

Bảng 1-1 Các phương thức của lớp String

Biên dịch sang tiếng việt Chương 2

Nội dung trong chương này:

 Làm việc với mảng một chiều cơ bản

 Sử dụng trình khởi tạo mảng để thiết lập giá trị ban đầu của một mảng

 Sử dụng vòng lặp for với mảng

 Làm việc với mảng hai chiều

 Làm việc với lớp Arrays

Mảng là một khía cạnh quan trọng của bất kỳ ngôn ngữ lập trình nào, và Java không phải là một ngoại lệ Trong chương này, bạn sẽ khám phá mọi thứ bạn cần biết về việc sử dụng mảng. Tôi sẽ giới thiệu về mảng một chiều thông thường; mảng đa chiều; và hai lớp được sử dụng để làm việc với mảng, có tên là Array và Arrays.

Một mảng là một tập hợp các biến được tham chiếu bằng cách sử dụng một tên biến duy nhất kết hợp với một số chỉ mục Mỗi phần tử của mảng được gọi là một phần tử Tất cả các phần tử trong mảng phải thuộc cùng một loại Do đó, mảng chính nó có một loại chỉ định loại phần tử mà nó có thể chứa Ví dụ, một mảng int có thể chứa giá trị int, và một mảng String có thể chứa chuỗi.

Chỉ mục ghi sau tên biến trong dấu ngoặc vuông; vì thế nếu tên biến là x, bạn có thể truy xuất một phần tử cụ thể bằng biểu thức dạng x[5].

Bạn có thể nghĩ rằng x[5] sẽ tham chiếu đến phần tử thứ năm trong mảng Nhưng số chỉ mục bắt đầu từ không cho phần tử đầu tiên, vì vậy x[5] thực sự tham chiếu đến phần tử thứ sáu. Chi tiết nhỏ này là một trong những nguyên nhân chính gây ra vấn đề khi làm việc với mảng, đặc biệt nếu bạn đã bắt đầu lập trình mảng trong một ngôn ngữ mà mảng được đánh chỉ mục từ một thay vì từ không Vì vậy, trong Java, hãy quen việc đếm từ không thay vì từ một.

Sức mạnh thực sự của mảng đến từ sự thực tế đơn giản là bạn có thể sử dụng một biến hoặc thậm chí là một biểu thức hoàn chỉnh như một chỉ số mảng Vì vậy (ví dụ), thay vì mã hóa x[5] để tham chiếu đến một phần tử mảng cụ thể, bạn có thể mã hóa x[i] để tham chiếu đến phần tử được chỉ định bởi biến chỉ số i Bạn sẽ thấy nhiều ví dụ về biến chỉ số trong toàn bộ chương này.

Dưới đây là một số thông tin thêm về mảng để cân nhắc trước khi bạn đi vào chi tiết về việc tạo và sử dụng mảng:

 Một mảng chính nó là một đối tượng Bạn có thể tham chiếu đến đối tượng mảng như một toàn bộ, thay vì đến một phần tử cụ thể của mảng, bằng cách sử dụng tên biến của mảng mà không có chỉ số Do đó, nếu x[5] tham chiếu đến một phần tử của mảng, thì x tham chiếu đến mảng chính nó.

 Một mảng có chiều dài cố định được thiết lập khi mảng được tạo Chiều dài này xác định số lượng phần tử có thể được lưu trữ trong mảng Giá trị chỉ mục tối đa bạn có thể sử dụng với bất kỳ mảng nào là một ít hơn một so với chiều dài của mảng Do đó, nếu bạn tạo một mảng có mười phần tử, bạn có thể sử dụng giá trị chỉ mục từ 0 đến 9.

 Bạn không thể thay đổi chiều dài của mảng sau khi bạn đã tạo mảng.

 Bạn có thể truy cập chiều dài của mảng bằng cách sử dụng trường length của biến mảng Ví dụ, x.length sẽ trả về chiều dài của mảng x.

Trước khi bạn có thể tạo một mảng, bạn phải khai báo một biến tham chiếu đến mảng Khai báo biến này nên chỉ định loại các phần tử được lưu trữ bởi mảng, theo sau là một bộ ngoặc vuông trống, như sau:

String[] names; Đây là một biến được đặt tên là "names" Loại của nó là một mảng các đối tượng String Chỉ để đảm bảo rằng bạn càng bối rối càng tốt, trong Java bạn cũng có thể đặt dấu ngoặc vuông trên tên biến thay vì trên loại Cả hai câu lệnh sau đây đều tạo ra các mảng chứa các phần tử int: int[] array1; // an array of int elements int array2[]; // another array of int elements

Cả hai câu lệnh này có chính xác cùng một hiệu quả Hầu hết các lập trình viên Java thường thích đặt dấu ngoặc vuông trên loại thay vì trên tên biến.

Một mình, câu lệnh đó không tạo ra một mảng; nó chỉ đơn giản là khai báo một biến có thể tham chiếu đến một mảng Bạn có thể tạo ra mảng theo hai cách:

 Sử dụng từ khóa new, sau đó là loại mảng, lần này với các dấu ngoặc vuông được điền vào để chỉ định số lượng phần tử mà mảng có thể chứa Ví dụ:

Tạo mảng chuỗi có 10 phần tử có thể chứa 10 chuỗi đối tượng String Mỗi chuỗi trong mảng được khởi tạo thành chuỗi rỗng.

 Tương tự như bất kỳ biến nào khác, bạn có thể kết hợp việc khai báo và tạo mảng vào một câu lệnh:

String[] names = new String[10]; Ở đây, biến mảng được khai báo và một mảng được tạo trong một câu lệnh.

Nếu bạn không biết số lượng phần tử mảng cần tại thời điểm biên dịch, bạn có thể sử dụng một biến hoặc một biểu thức cho độ dài mảng Dưới đây là một đoạn mã từ một phương thức lưu trữ tên người chơi trong một mảng chuỗi Nó bắt đầu bằng cách hỏi người dùng có bao nhiêu người chơi trong đội Sau đó, nó tạo ra một mảng có kích thước chính xác:

System.out.print("How many players? "); int count = sc.nextInt(); // sc is a Scanner

String[] players = new String[count];

Một cách để khởi tạo các giá trị trong một mảng là đơn giản gán chúng một cách lần lượt:

Java có một cách rút gọn để tạo ra một mảng và khởi tạo nó với các giá trị hằng số: int[] primes = { 2, 3, 5, 7, 11, 13, 17 };

Chú ý: Độ dài của một mảng được tạo ra với một bộ khởi tạo được xác định bởi số lượng giá trị được liệt kê trong bộ khởi tạo.

Một cách thay thế để viết một bộ khởi tạo là như sau: int[] primes = new int[] { 2, 3, 5, 7, 11, 13, 17 }; Để sử dụng loại bộ khởi tạo này, bạn sử dụng từ khóa new, sau đó là loại mảng và một bộ ngoặc vuông trống Sau đó, bạn mã hóa bộ khởi tạo.

DÙNG VÒNG LẶP FOR VỚI MẢNG

Biên dịch sang tiếng việt Chương 3

Chương 3: Sử dụng lớp ArrayList

Nội dung trong phần này: ằ Làm việc với lớp ArrayList ằ Tạo một danh sỏch mảng (array list) ằ Giới thiệu về generics ằ Thờm phần tử vào danh sỏch mảng ằ Xúa phần tử hoặc sửa đổi phần tử trong danh sỏch mảng

Một số người thích sưu tập đồ vật: đồ trang sức, thẻ bóng chày, tem bưu chính, búp bê - bạn đặt tên cho nó, ai đó sẽ sưu tập nó.

Nếu tôi là người sưu tầm một thứ ngẫu nhiên nào đó - chẳng hạn như các bảng hiệu quảng cáo bằng thiếc cũ - thì một danh sách sẽ là một lựa chọn tồi để lưu trữ dữ liệu Đó là bởi vì vào bất kỳ ngày nào, tôi có thể tìm thấy một tấm bảng hiệu bằng thiếc khác ở một cửa hàng bán đồ cũ.

Vì vậy, nếu trước đây tôi có 87 bảng hiệu bằng thiếc và tôi đã tạo một danh sách đủ lớn để chứa tất cả 87 cái thì tôi sẽ phải thay đổi phần khai báo danh sách để chứa 88 bảng hiệu. Các lớp tập hợp của Java được thiết kế để đơn giản hóa việc lập trình cho các ứng dụng phải theo dõi các nhóm đối tượng Các lớp này rất mạnh mẽ và dễ sử dụng một cách đáng ngạc nhiên - ít nhất là những điều cơ bản Các tính năng nâng cao hơn của các lớp tập hợp cần phải lập trình nghiêm túc để sử dụng đúng cách, nhưng đối với hầu hết các ứng dụng, tất cả những gì bạn cần là một vài phương pháp đơn giản để sử dụng các lớp tập hợp.

Thật không may, các lớp tập hợp của Java được tổ chức theo hệ thống phân cấp kế thừa khá phức tạp và có thể gây nhầm lẫn cho người mới bắt đầu Hầu hết các cuốn sách Java mà tôi có trên kệ đều bắt đầu bằng cách giải thích sơ đồ kế thừa này và chỉ ra cách mỗi lớp tập hợp khác nhau phù hợp với sơ đồ này và lý do.

Tôi sẽ không làm điều đó Tôi nghĩ sẽ rất khó hiểu đối với những người mới tham gia tập hợp khi phải vượt qua hệ thống phân cấp lớp không có ý nghĩa gì cho đến khi họ biết một số chi tiết về cách hoạt động của các lớp cơ bản Thay vào đó, tôi chỉ cho bạn cách sử dụng hai lớp tốt nhất trong số này

Trong chương này, bạn tìm hiểu cách sử dụng lớp ArrayList Sau đó, trong chương tiếp theo, bạn sẽ tìm hiểu cách sử dụng người anh em họ đầu tiên của nó, LinkedList Khi bạn biết cách sử dụng hai lớp này, bạn sẽ không gặp khó khăn gì khi tìm ra cách sử dụng các lớp tập hợp khác từ tài liệu API.

Java 1.5 đã giới thiệu một tính năng ngôn ngữ mới quan trọng được gọi là generics nhằm mục đích cụ thể là làm cho các tập hợp dễ dàng làm việc hơn Cụ thể, tính năng generics cho phép bạn tạo các đối tượng danh sách, chẳng hạn như ArrayList hoặc LinkedList , được liên kết với một kiểu dữ liệu cụ thể, chẳng hạn như chuỗi hoặc số nguyên.

Bởi vì generics là một phần không thể thiếu trong cách các tập hợp hoạt động trong Java 1.5 và các phiên bản tiếp theo, nên tôi kết hợp tính năng generics vào chương này ngay từ đầu. Tôi chỉ ra những khác biệt khi sử dụng ArrayList mà không cần dùng chung, đề phòng trường hợp bạn đang sử dụng phiên bản Java cũ hoặc đang làm việc với các chương trình được viết trước khi Java 1.5 có sẵn (Để có giải thích đầy đủ về cách hoạt động của tính năng generics, bạn có thể chuyển sang Quyển 4, Chương 5.)

Tôi thậm chí còn có thêm tin tốt về các tính năng mới: tính năng chính mới được giới thiệu với Java 8, biểu thức lambda, cung cấp một cách làm việc hoàn toàn mới với các tập hợp, đặc biệt hữu ích để xử lý hiệu quả các tập hợp có số lượng mục lớn Để biết thêm thông tin về cách làm việc với các tính năng tập hợp mới này, hãy xem Chương 6 của cuốn sách nhỏ này

Và để biết thêm thông tin về biểu thức lambda, xem Quyển 3, Chương 7.

Danh sách mảng là một loại tập hợp Java cơ bản nhất, tự động thay đổi kích thước khi cần thiết, cho phép chèn phần tử vào giữa tập hợp, xóa mục và sử dụng một mảng đệm bên trong để lưu trữ dữ liệu Lớp ArrayList quản lý kích thước của mảng đệm này, tự động tạo một mảng mới lớn hơn khi mảng gốc đầy và sao chép các mục hiện có vào mảng mới trước khi thêm mục mới.

Lớp ArrayList có một số hàm tạo và rất nhiều phương thức Để bạn tham khảo, Bảng 3-1 liệt kê các hàm tạo và phương thức của lớp ArrayList

Phần còn lại của chương này sẽ chỉ cho bạn cách sử dụng các hàm tạo và phương thức này để làm việc với các đối tượng ArrayList

ArrayList() Tạo một danh sách mảng với dung lượng ban đầu là mười phần tử.

ArrayList(int capacity) Tạo một danh sách mảng với dung lượng ban đầu được chỉ định ArrayList(Collection c) Tạo một danh sách mảng và sao chép tất cả các phần tử từ tập hợp đã chỉ định vào danh sách mảng mới.

Method Giải thích add(Object element) Thêm đối tượng được chỉ định vào danh sách mảng Nếu bạn đã chỉ định một loại khi tạo danh sách mảng thì đối tượng đó phải đúng loại. add(int index, Object element)

Thêm đối tượng đã chỉ định vào danh sách mảng tại vị trí chỉ mục đã chỉ định Nếu bạn đã chỉ định một loại khi tạo danh sách mảng thì đối tượng đó phải thuộc đúng loại. addAll(Collection c) Thêm tất cả các phần tử của tập hợp đã chỉ định vào danh sách mảng này. addAll(int index, Collection c)

Thêm tất cả các phần tử của tập hợp đã chỉ định vào danh sách mảng này tại vị trí chỉ mục đã chỉ định.

Clear() Xóa tất cả các phần tử khỏi danh sách mảng clone() Trả về một bản sao nông của danh sách mảng Các phần tử chứa trong bản sao là các thể hiện đối tượng giống như các phần tử trong bản gốc. contains(Object elem) Trả về một boolean cho biết đối tượng đã chỉ định có nằm trong danh sách mảng. containsAll(Collection c) Trả về một boolean cho biết danh sách mảng này có chứa tất cả các đối tượng trong tập hợp được chỉ định ensureCapacity(int minCapacity)

Biên dịch sang tiếng việt Chương 4

Chương 4: Sử dụng lớp LinkedList

Danh sách liên kết là cấu trúc dữ liệu tuyến tính lưu trữ các phần tử dưới dạng chuỗi các nút được liên kết với nhau bằng con trỏ Trong khi danh sách mảng lưu trữ phần tử liên tiếp trong bộ nhớ, danh sách liên kết không yêu cầu phần tử phải nằm cạnh nhau Để tạo danh sách liên kết, cần khởi tạo một nút đầu tiên và phần tử đầu tiên được lưu trữ trong nút này Sau đó, có thể thêm phần tử vào danh sách bằng cách tạo một nút mới, gán giá trị cho nút mới và liên kết nút mới với nút trước đó Để truy xuất phần tử, chỉ cần duyệt qua danh sách và tìm nút có giá trị phù hợp Cập nhật và xóa phần tử cũng tương tự, bằng cách điều chỉnh các con trỏ liên kết.

Lớp danh sách mảng mà tôi đã đề cập ở chương trước là một lớp tập hợp dựa trên một mảng. Mảng có điểm mạnh và điểm yếu Điểm mạnh của mảng là nó rất hiệu quả - ít nhất là cho đến khi bạn lấp đầy nó hoặc cố gắng sắp xếp lại nó bằng cách chèn hoặc xóa các phần tử Sau đó, nó đột ngột trở nên rất kém hiệu quả.

Trong những năm qua, các nhà khoa học máy tính đã phát triển nhiều giải pháp thay thế mảng hiệu quả hơn cho một số loại truy cập nhất định Một trong những lựa chọn thay thế lâu đời nhất là danh sách liên kết Danh sách liên kết kém hiệu quả hơn mảng đối với các tác vụ như truy cập trực tiếp vào một phần tử dựa trên số chỉ mục của nó, nhưng danh sách liên kết sẽ chạy vòng quanh mảng khi bạn cần chèn hoặc xóa các mục ở giữa danh sách.

Trong chương này, bạn tìm hiểu cách sử dụng lớp LinkedList của Java, lớp này cung cấp một tập hợp dựa trên danh sách liên kết thay vì mảng Bạn sẽ thấy rằng mặc dù lớp LinkedList cung cấp nhiều tính năng giống như lớp ArrayList nhưng nó cũng có một số thủ thuật riêng.

Java 1.5 đã giới thiệu một tính năng ngôn ngữ mới quan trọng được gọi là generics nhằm mục đích cụ thể là làm cho các bộ sưu tập dễ dàng làm việc hơn Cụ thể, tính năng generics giúp bạn có thể tạo các đối tượng danh sách, chẳng hạn như ArrayList hoặc LinkedList, được liên kết với một kiểu dữ liệu cụ thể, chẳng hạn như chuỗi hoặc số nguyên Bởi vì generics là một phần không thể thiếu trong cách các bộ sưu tập hoạt động trong Java 1.5 trở lên, nên tôi kết hợp tính năng generics vào chương này ngay từ đầu Tôi chỉ ra sự khác biệt khi sử dụng ArrayList mà không cần dùng thuốc generic, chỉ trong trường hợp bạn đang sử dụng phiên bản Java cũ hơn hoặc đang làm việc với các chương trình được viết trước khi có Java 1.5 (Để có giải thích đầy đủ về cách hoạt động của tính năng generics, bạn có thể đọc Quyển 4, Chương 5.)

Ngoài ra, hãy lưu ý rằng các biểu thức lambda, được giới thiệu trong Java 8, cung cấp một phương thức thay thế để làm việc với các bộ sưu tập, bao gồm cả lớp LinkedList Để biết thêm thông tin về cách làm việc với các tính năng bộ sưu tập mới này, hãy xem Chương 6 của cuốn sách nhỏ này Và để biết thêm thông tin về biểu thức lambda, hãy xem Quyển 3, Chương 7.

HIỂU LỚP DANH SÁCH LIÊN KẾT

Danh sách liên kết là một tập hợp trong đó mỗi đối tượng trong danh sách duy trì cùng với nó một con trỏ tới đối tượng sau trong danh sách và một con trỏ khác tới đối tượng trước trong danh sách Không có mảng nào được tham gia vào danh sách liên kết Thay vào đó, danh sách được quản lý hoàn toàn bởi những con trỏ này. Đừng lo lắng — bạn không cần phải tự mình thực hiện bất kỳ công việc quản lý con trỏ nào. Tất cả đều được lớp danh sách đảm nhiệm cho bạn.

Sự sắp xếp này có một số lợi thế hấp dẫn hơn so với mảng:

 Vì lớp danh sách mảng sử dụng một mảng để lưu trữ dữ liệu danh sách nên lớp danh sách mảng thường phải phân bổ lại mảng của nó khi bạn thêm các mục vào danh sách. Không như vậy với lớp danh sách liên kết Danh sách liên kết không có bất kỳ vấn đề nào về kích thước Bạn có thể tiếp tục thêm các mục vào danh sách liên kết cho đến khi máy tính của bạn hết bộ nhớ.

 Giống như lớp danh sách mảng, lớp danh sách liên kết cho phép bạn chèn các mục vào giữa danh sách Tuy nhiên, với lớp danh sách mảng, thao tác này khá kém hiệu quả.

Nó phải sao chép tất cả các mục qua điểm chèn một khe để giải phóng một khe cho mục bạn đang chèn Không như vậy với lớp danh sách liên kết Để chèn một mục vào giữa danh sách liên kết, tất cả những gì bạn phải làm là thay đổi con trỏ trong các đối tượng trước và sau.

 Với danh sách mảng, việc xóa các mục khỏi danh sách khá kém hiệu quả Các lớp danh sách mảng phải sao chép mọi mục sau mục đã xóa một ô gần phía trước của mảng để lấp đầy khoảng trống mà mục đã xóa để lại Không như vậy với lớp danh sách liên kết Để xóa một mục khỏi danh sách được liên kết, tất cả những gì cần thiết là cập nhật các con trỏ trong các mục trước và sau mục cần xóa Ví dụ: nếu bạn muốn xóa mục thứ ba khỏi danh sách có 10.000 mục trong đó, lớp danh sách mảng phải sao chép 9.997 mục Ngược lại, lớp danh sách liên kết thực hiện điều đó bằng cách chỉ cập nhật hai mục Vào thời điểm lớp danh sách mảng hoàn thành, lớp danh sách liên kết đã có thời gian để cắt cỏ, đọc sách và đi chơi Disneyland.

 Danh sách liên kết đặc biệt phù hợp với việc tạo hai loại danh sách phổ biến: o Ngăn xếp: Ngăn xếp là một danh sách trong đó các mục có thể được thêm vào và lấy ra chỉ từ phần đầu của danh sách. o Hàng đợi: Hàng đợi là một danh sách trong đó các mục luôn được thêm vào phía sau danh sách và luôn được lấy từ phía trước.

Mảng cực kỳ kém hiệu quả đối với loại xử lý được yêu cầu bởi ngăn xếp và hàng đợi. (Bạn xem ví dụ về cách sử dụng danh sách liên kết để tạo ngăn xếp và hàng đợi trong Quyển 4, Chương 5.)

 Lớp danh sách mảng thực sự sử dụng một mảng bên trong để lưu trữ dữ liệu bạn thêm vào danh sách mảng Lớp danh sách mảng đảm nhiệm việc quản lý kích thước của mảng này Khi bạn thêm một mục vào danh sách mảng và mảng cơ bản đã đầy, lớp danh sách mảng sẽ tự động tạo một mảng mới có dung lượng lớn hơn và sao chép các mục hiện có vào mảng mới trước khi thêm mục mới.

Tuy nhiên, không có thứ gọi là miễn phí Tính linh hoạt của danh sách liên kết phải trả giá: Danh sách liên kết yêu cầu nhiều bộ nhớ hơn mảng và chậm hơn mảng khi truy cập tuần tự đơn giản.

Biên dịch sang tiếng việt Chương 5

Chương 5: Tạo các lớp Bộ sưu tập Thông số hóa

Nội dung trong phần này: ằ Khỏm phỏ lý do generics được phỏt minh ằ Sử dụng generics trong cỏc lớp của bạn ằ Làm việc với dấu chấm hỏi trong một lớp generics ằ Kiểm tra một cặp lớp mẫu thể hiện generics

Trong hai chương trước, bạn đã thấy cách bạn có thể chỉ định kiểu cho ArrayList hoặc LinkedList để trình biên dịch có thể ngăn bạn vô tình thêm loại dữ liệu sai vào bộ sưu tập. Các lớp ArrayList và LinkedList có thể làm điều này vì chúng tận dụng lợi thế của một tính năng được gọi là generics Generics lần đầu tiên có sẵn trong Java 1.5.

Trong chương này, tôi chỉ cho bạn cách tính năng generics hoạt động và cách đưa nó vào sử dụng trong các lớp của riêng bạn Cụ thể, bạn thấy ví dụ về hai lớp sử dụng lớp LinkedList để thực hiện một loại bộ sưu tập cụ thể Đầu tiên là một ngăn xếp, một bộ sưu tập trong đó các mục luôn được thêm vào phía trước danh sách và được truy xuất từ phía trước danh sách Thứ hai là một hàng đợi, một bộ sưu tập trong đó các mục được thêm vào cuối danh sách và được truy xuất từ phía trước. Đây là một trong những chương mà toàn bộ chương có thể nhận được biểu tượng Nội dung kỹ thuật Thành thật mà nói, generics là cạnh hàng đầu của lập trình hướng đối tượng Bạn có thể nhận được mà không cần biết bất kỳ thông tin nào trong chương này, vì vậy hãy bỏ qua nó nếu bạn đang trên đường đến một cái gì đó thú vị hơn Tuy nhiên, chương này rất đáng xem, ngay cả khi bạn chỉ muốn có ý tưởng về cách các lớp ArrayList và LinkedList sử dụng tính năng generics mới Và bạn có thể thấy rằng một ngày nào đó bạn muốn tạo các lớp chung của riêng mình Bạn bè của bạn chắc chắn sẽ nghĩ bạn là một thiên tài. Để chắc chắn, tôi sẽ không bao gồm tất cả những phức tạp của lập trình với generics Nếu công việc tiếp theo của bạn là viết các thư viện lớp Java cho Oracle, bạn sẽ cần biết nhiều hơn về generics so với chương này Tôi chỉ tập trung vào những điều cơ bản của việc viết các lớp chung đơn giản.

Trước Java 1.5, các lớp tập hợp có thể chứa bất kỳ loại đối tượng nào Ví dụ: phương thức add cho lớp ArrayList có khai báo sau: public boolean add(Object o)

// mã để thực hiện phương thức add

Vì vậy, bạn có thể chuyển bất kỳ loại đối tượng nào vào phương thức —add và danh sách mảng sẵn sàng chấp nhận nó.

Khi bạn truy xuất một mục từ một bộ sưu tập, bạn phải chuyển nó sang đúng loại đối tượng trước khi bạn có thể làm bất cứ điều gì với nó Ví dụ: nếu bạn có một danh sách mảng có tên empList với các đối tượng Nhân viên, bạn sẽ sử dụng một câu lệnh như thế này để lấy Nhân viên đầu tiên từ danh sách:

Vấn đề là, nếu mục đầu tiên trong danh sách không phải là Nhân viên thì sao? Vì phương thức add chấp nhận bất kỳ loại đối tượng nào nên không có cách nào đảm bảo rằng chỉ một số loại đối tượng nhất định mới có thể được thêm vào bộ sưu tập. Đó là lý do tại sao generics được phát minh Bây giờ bạn có thể khai báo ArrayList như thế này:

ArrayList empList = new ArrayList(); Ở đây empList được khai báo là một ArrayList chỉ có thể chứa các kiểu Nhân viên Bây giờ phương thức add có một khai báo tương đương với điều này: public boolean add( Nhanvien o)

// mã được thực hiện trong phương thức add

Vì vậy bạn chỉ có thể thêm các đối tượng Nhân viên vào danh sách Và phương thức get có một khai báo tương đương với điều này: public Nhanvien get(int index)

// mã được thực hiện trong phương thức get

Do phương thức get trả về các đối tượng Nhân viên, nên không cần truyền kết quả vì trình biên dịch đủ thông minh để nhận biết đối tượng là Nhân viên.

Generics cho phép tạo các lớp sử dụng được cho bất kỳ kiểu nào do lập trình viên chỉ định vào thời điểm biên dịch Để đạt được điều này, các nhà thiết kế Java đã giới thiệu một tính năng, gọi là tham số kiểu chính thức Để tạo lớp sử dụng tham số kiểu chính thức, liệt kê tham số kiểu trong dấu ngoặc nhọn sau tên lớp Tham số kiểu có một tên - Oracle khuyên bạn nên sử dụng chữ cái hoa đơn cho tên tham số kiểu - dùng trong lớp bất kỳ nơi nào sử dụng kiểu.

Ví dụ: đây là phiên bản đơn giản của khai báo lớp cho lớp ArrayList: public class ArrayList

Tôi đã bỏ qua các mệnh đề mở rộng và triển khai để tập trung vào tham số kiểu chính thức:

Tham số E chỉ định loại phần tử được lưu trữ trong danh sách Oracle khuyến nghị tên tham số loại E (cho Phần tử) cho bất kỳ tham số nào chỉ định loại phần tử trong bộ sưu tập.

Vì vậy hãy xem xét đoạn này:

ArrayList empList; Ở đây tham số E là Nhân viên, có nghĩa đơn giản là loại phần tử cho phiên bản này của lớp ArrayList là Nhân viên.

Bây giờ hãy xem phần khai báo phương thức add cho lớp ArrayList: public boolean add(E o)

// thân của phương thức add

Nơi bạn thường mong đợi nhìn thấy một loại tham số, bạn sẽ thấy chữ cái E Do đó, khai báo phương thức này chỉ định rằng loại cho tham số o là loại được chỉ định cho tham số loại chính thức E Nếu E là Nhân viên, điều đó có nghĩa là phương thức thêm chỉ chấp nhận các đối tượng Nhân viên.

Càng xa càng tốt Bây giờ hãy xem cách bạn có thể sử dụng tham số loại hình thức làm kiểu trả về Đây là phần khai báo cho phương thức get: public E get(int index)

// thân của phương thức get

} Ở đây E được chỉ định làm kiểu trả về Điều đó có nghĩa là nếu E là Nhân viên, phương thức này trả về các đối tượng Nhân viên.

Trước khi tiếp tục, có một kỹ thuật cuối cùng bạn cần nắm đó là: bạn có thể sử dụng tham số kiểu hình thức trong lớp của mình để tạo đối tượng của bất kỳ lớp nào khác chấp nhận tham số kiểu hình thức đó.

ArrayList v = (ArrayList) super.clone(); v.elementData = (E[])new Object[size];

System.arraycopy(elementData, 0, v.elementData, 0, size); v.modCount = 0; return v;

// điều này sẽ không xảy ra vì chúng ta đang Cloneable Throw new InternalError();

Bạn không cần phải xem nhiều chi tiết trong phương pháp này; chỉ cần lưu ý rằng câu lệnh đầu tiên trong khối thử khai báo một ArrayList loại Nói cách khác, lớp ArrayList sử dụng tham số kiểu chính thức của riêng nó để tạo một đối tượng danh sách mảng khác cùng loại Nếu bạn nghĩ về nó, điều đó hoàn toàn hợp lý Suy cho cùng, đó chính là công dụng của phương thức nhân bản: Nó tạo ra một danh sách mảng khác giống như danh sách này.

Biên dịch sang tiếng việt Chương 6

Chương 6: Dùng các Thao tác Dữ liệu Đại lượng với Bộ sưu tập

Nội dung trong phần này: ằ Hiểu về cỏc hoạt động cơ bản của luồng (stream) ằ Kiểm tra giao diện luồng ằ Lọc và sắp xếp luồng ằ Tớnh tổng, trung bỡnh, và cỏc giỏ trị khỏc trong luồng

Một trong những điều phổ biến nhất cần làm với một bộ sưu tập là lặp lại nó, thực hiện một số loại thao tác trên tất cả các phần tử của nó Ví dụ: bạn có thể sử dụng vòng lặp foreach để in tất cả các phần tử Phần thân của vòng lặp foreach có thể chứa câu lệnh if để chọn phần tử cần in Hoặc nó có thể thực hiện một phép tính như tích lũy tổng lớn hoặc đếm số phần tử đáp ứng một điều kiện nhất định.

Trong Java, vòng lặp foreach rất dễ tạo và có thể rất mạnh mẽ Tuy nhiên, chúng có một nhược điểm đáng kể: Chúng lặp lại lần lượt các phần tử của bộ sưu tập, bắt đầu từ phần tử đầu tiên và tiến hành tuần tự đến phần tử cuối cùng Kết quả là, vòng lặp foreach phải được thực hiện tuần tự trong một bước duy nhất. Điều đó thật đáng tiếc vì các máy tính hiện đại có bộ xử lý đa lõi có khả năng thực hiện nhiều việc cùng một lúc Sẽ thật tuyệt nếu bạn có thể chia vòng lặp foreach thành nhiều phần, mỗi phần có thể chạy độc lập trên một trong các lõi của quy trình? Đối với một bộ sưu tập nhỏ, người dùng có thể sẽ không nhận thấy sự khác biệt Nhưng nếu bộ sưu tập cực kỳ lớn (chẳng hạn như vài triệu phần tử), việc giải phóng sức mạnh của bộ xử lý đa lõi có thể khiến chương trình chạy nhanh hơn nhiều

Mặc dù bạn có thể làm điều đó với các phiên bản Java cũ hơn nhưng việc lập trình rất phức tạp Bạn phải nắm vững một trong những khía cạnh khó khăn hơn của việc lập trình trongJava: làm việc với các luồng, giống như các phần riêng biệt của chương trình có thể được thực hiện đồng thời Bạn sẽ học những kiến thức cơ bản về cách làm việc với các luồng trongQuyển 5, Chương 1 Bây giờ, hãy tin tôi: Viết chương trình hoạt động với các tập hợp dữ liệu lớn và tận dụng nhiều luồng là một việc khó khăn Ít nhất là cho đến Java 8

Với Java 8 trở lên, thao tác dữ liệu hàng loạt xử lý vấn đề hiệu suất bằng cách tránh lặp lại trực tiếp dữ liệu thu thập bằng vòng lặp foreach Thay vào đó, bạn chỉ cần cung cấp các thao tác sẽ được thực hiện trên từng thành phần của bộ sưu tập và để Java xử lý chi tiết phân tán công việc trên nhiều luồng.

Trọng tâm của tính năng thao tác dữ liệu hàng loạt là một loại đối tượng mới được gọi là luồng, được xác định bởi giao diện luồng Luồng chỉ đơn giản là một chuỗi các phần tử thuộc bất kỳ loại dữ liệu nào có thể được xử lý tuần tự hoặc song song Streaminterface cung cấp các phương thức cho phép bạn thực hiện nhiều thao tác khác nhau như lọc các phần tử hoặc thực hiện thao tác trên từng phần tử. Đừng nhầm lẫn loại luồng tôi mô tả trong chương này với các luồng tệp được mô tả trong Quyển 8, Chương 2 Các luồng tệp được sử dụng để đọc và ghi dữ liệu vào tệp đĩa Các luồng được mô tả trong chương này được sử dụng để xử lý dữ liệu được trích xuất từ các lớp tập hợp.

Luồng sử dụng biểu thức lambda để biến đổi các phần tử trong luồng Thực tế, mục đích chính để Java tích hợp biểu thức lambda vào ngôn ngữ là để hỗ trợ luồng Trước khi đi sâu vào chương này, bạn nên đọc Quyển 3, Chương 7 để hiểu rõ hơn về cú pháp lambda, nếu không bạn sẽ khó nắm bắt được nội dung trình bày trong chương.

Trong chương này, bạn tìm hiểu những kiến thức cơ bản về cách sử dụng luồng để thực hiện các thao tác dữ liệu hàng loạt đơn giản

NHÌN VÀO MỘT HOẠT ĐỘNG DỮ LIỆU HÀNG LOẠT CƠ BẢN

Giả sử bạn có một danh sách các phép thuật được sử dụng bởi một thuật sĩ nào đó, vì mục đích bản quyền, chúng tôi sẽ gọi đơn giản là HP Các phép thuật được thể hiện bằng một lớp có tên Spell, được định nghĩa như sau: public class Spell

{ public String name; public SpellType type; public String description; public enum SpellType {SPELL, CHARM, CURSE} public Spell(String spellName, SpellType spellType, String spellDescription)

{ name = spellName; type = spellType; description = spellDescription;

Như bạn có thể thấy, lớp Chính tả có ba trường công khai đại diện cho tên, loại (SPELL,CHARM hoặc CURSE) và mô tả của câu thần chú, cũng như một hàm tạo cho phép bạn chỉ định tên, loại và mô tả cho câu thần chú Ngoài ra, phương thức toString() được ghi đè để chỉ trả về tên chính tả.

Hãy tải một số phép thuật của HP vào ArrayList:

ArrayList spells = new ArrayList(); spells.add(new Spell("Aparecium", Spell.SpellType.SPELL,

"Makes invisible ink appear.")); spells.add(new Spell("Avis", Spell.SpellType.SPELL, "Launches birds from your wand.")); spells.add(new Spell("Engorgio", Spell.SpellType.CHARM,

"Enlarges something.")); spells.add(new Spell("Fidelius", Spell.SpellType.CHARM, "Hides a secret within someone.")); spells.add(new Spell("Finite

Incatatum", Spell.SpellType.SPELL, "Stops all current spells.")); spells.add(new Spell("Locomotor Mortis",

Spell.SpellType.CURSE, "Locks an opponent's legs."));

Giả sử bạn muốn liệt kê tên của từng câu thần chú trên bảng điều khiển Bạn có thể làm điều đó bằng cách sử dụng vòng lặp foreach như thế này: for (Spell spell : spells)

System.out.println(spell.name);

Mã tương đương sử dụng các luồng trông như thế này: spells.stream().forEach(s -> System.out.println(s));

Trước tiên, lần đầu tiên tôi sử dụng phương thức luồng của lớp ArrayList để chuyển đổi ArrayL ist thành luồng Tất cả các lớp kế thừa từ java.Collection đều triển khai một phương thức luồng trả về một đối tượng Luồng Điều đó không chỉ bao gồm ArrayList mà còn cả LinkedList và Stack.

Tiếp theo, tôi sử dụng phương thức forEach của luồng để lặp lại luồng, truyền biểu thức lambda gọi System.out.println cho từng mục trong luồng Phương thức forEach xử lý toàn bộ luồng, ghi từng phần tử vào bảng điều khiển.

Nếu bạn chỉ muốn liệt kê các phép thuật, không phải bùa chú hay lời nguyền Sử dụng vòng lặp foreach truyền thống, bạn sẽ làm như thế này: for (Spell spell : spells)

{ if (spell.type == Spell.SpellType.SPELL)

System.out.println(spell.name);

} Ở đây câu lệnh if chỉ chọn các phép thuật để các bùa chú và lời nguyền không được liệt kê. Đây là điều tương tự khi sử dụng luồng: spells.stream()

.filter(s -> s.type == Spell.SpellType.SPELL)

Trong ví dụ này, phương thức luồng chuyển đổi ArrayList thành luồng Sau đó, phương pháp lọc của luồng được sử dụng để chỉ chọn các mục SPELL Cuối cùng, phương thức forEach gửi các mục đã chọn tới bàn điều khiển Lưu ý rằng biểu thức lambda được sử dụng trong cả phương thức forEach và phương thức filter.

THỰC HIỆN BÀI TẬP BẰNG JAVA

Bài 46: Hãy đếm số lượng chữ số lẻ của số nguyên dương n. import java.util.Scanner; public class Bai46 { public static int countOddDigits(int n) { int count = 0;

// Duyệt qua từng chữ số& cu'a số& nguyên dương n while (n > 0) { int digit = n % 10; // Lấ&y chữ số& cuố&i cùng if (digit % 2 != 0) { // Kiê'm tra chữ số& có pha'i là số& le' khống count++;

} n /= 10; // Loại bo' chữ số& cuố&i cùng

// Tra' vê> số& lượng chữ số& le' return count;

} public static void main(String[] args) {

Scanner scanner = new Scanner(System in );

System out print("Nhập một số& nguyên dương: "); int number = scanner.nextInt();

// Kiê'm tra số& lượng chữ số& le' và in kê&t qua' int oddDigitCount = countOddDigits(number);

System out println("Số& lượng chữ số& le' cu'a số& " + number + " là: " + oddDigitCount); scanner.close();

Kê&t qua' tra' vê> sau khi chạy chương trình:

Bài 216: Đếm số lượng chẵn trong mảng. import java.util.Scanner; public class Bai216 { public static int countEvenNumbers(int[] array) { int count = 0;

// Duyệt qua từng phấ>n tư' cu'a ma'ng for (int value : array) {

// Kiê'm tra nê&u phấ>n tư' là số& chẵMn if (value % 2 == 0) { count++;

// Tra' vê> số& lượng số& chẵMn trong ma'ng return count;

} public static void main(String[] args) {

Scanner scanner = new Scanner(System in );

System out print("Nhập số& lượng phấ>n tư' cu'a ma'ng: "); int n = scanner.nextInt();

// Khai báo ma'ng int[] array = new int[n];

// Nhập giá trị cho ma'ng for (int i = 0; i < n; i++) {

System out print("Nhập phấ>n tư' thứ " + (i + 1) +

// Đê&m số& lượng số& chẵMn trong ma'ng int evenCount = countEvenNumbers(array);

System out println("Số& lượng số& chẵMn trong ma'ng là: " + evenCount);

Kết quả trả về sau khi chạy chương trình:

Bài 217: Đếm số dương chia hết cho 7 trong mảng public class Bai217 { public static int countPositiveDivisibleBySeven(int[] array) { int count = 0;

// Duyệt qua từng phấ>n tư' cu'a ma'ng for (int value : array) {

// Kiê'm tra nê&u phấ>n tư' là số& dương và chia hê&t cho 7 if (value > 0 && value % 7 == 0) { count++;

// Tra' vê> số& lượng giá trị dương chia hê&t cho 7 return count;

} public static void main(String[] args) { int[] array = {14, 21, 28, 35, 42, 10, 5, 49}; int count = countPositiveDivisibleBySeven(array);

System out println("Số& lượng giá trị dương chia hê&t cho 7 trong ma'ng là: " + count);

Kết quả trả về sau khi chạy chương trình:

Bài 267: Viết hàm nhập mảng sao cho khi nhập xong thì giá trị trong mảng sắp xếp giảm dần. import java.util.Arrays; import java.util.Scanner; public class Bai267 { public static void main(String[] args) {

Scanner scanner = new Scanner(System in );

System out print("Nhập số& lượng phấ>n tư' cu'a ma'ng: "); int n = scanner.nextInt();

// Khai báo ma'ng int[] array = new int[n];

// Nhập giá trị cho ma'ng for (int i = 0; i < n; i++) {

System out print("Nhập phấ>n tư' thứ " + (i + 1) +

// Sẵ&p xê&p ma'ng gia'm dấ>n

Arrays.sort(array); for (int i = 0; i < n / 2; i++) { int temp = array[i]; array[i] = array[n - 1 - i]; array[n - 1 - i] = temp;

// In ma'ng sau khi sẵ&p xê&p gia'm dấ>n

System out println("Ma'ng sau khi sẵ&p xê&p gia'm dấ>n: " + Arrays.toString(array));

Kết quả trả về sau khi chạy chương trình:

Bài 278: Xóa tất cả các phần tử trùng nhau trong mảng và chỉ giữ lại duy nhất 1 phần tử import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class Bai278 { public static int[] removeDuplicates(int[] array) {

// Sư' dụng HashSet đê' lưu trữ các giá trị duy nhấ&t Set uniqueSet = new HashSet();

// Sư' dụng List đê' duy trì thứ tự cu'a các phấ>n tư' duy nhấ&t

List uniqueList = new ArrayList();

// Duyệt qua ma'ng và thêm các phấ>n tư' vào HashSet và List for (int value : array) { if (uniqueSet.add(value)) { uniqueList.add(value);

// Chuyê'n List vê> ma'ng int[] result = new int[uniqueList.size()]; for (int i = 0; i < uniqueList.size(); i++) { result[i] = uniqueList.get(i);

} public static void main(String[] args) { int[] array = {1, 2, 3, 4, 2, 5, 6, 1, 7, 8, 9, 5};

// Xóa các phấ>n tư' trùng nhau và chỉ' giữ lại một phấ>n tư' int[] resultArray = removeDuplicates(array);

// In ma'ng sau khi xóa phấ>n tư' trùng nhau

System out println("Ma'ng sau khi xóa các phấ>n tư' trùng nhau: " + Arrays.toString(resultArray));

Kết quả trả về sau khi chạy chương trình:

Bài 128 + 130: Viết hàm nhập, xuất mảng 1 chiều các số thực. import java.util.Scanner; public class Bai128_130 { public static void main(String[] args) {

// Khơ'i tạo ma'ng có kích thước 5 int size = 5; double[] array = new double[size];

// Gọi hàm nhập ma'ng inputArray(array);

// Gọi hàm xuấ&t ma'ng outputArray(array);

// Hàm nhập ma'ng public static void inputArray(double[] arr) {

Scanner scanner = new Scanner(System in );

System out println("Nhập vào các phấ>n tư' cu'a ma'ng:"); for (int i = 0; i < arr.length; i++) {

System out print("Phấ>n tư' thứ " + (i + 1) + ": "); arr[i] = scanner.nextDouble();

// Đóng Scanner đê' tránh rò rỉ' bộ nhớ scanner.close();

// Hàm xuấ&t ma'ng public static void outputArray(double[] arr) {

System out println("Ma'ng sau khi nhập là:"); for (int i = 0; i < arr.length; i++) {

System out println("Phấ>n tư' thứ " + (i + 1) + ": " + arr[i]);

Kết quả trả về sau khi chạy chương trình:

Bài 129 + 131: Viết hàm nhập, xuất mảng 1 chiều các số nguyên. import java.util.Scanner; public class Bai129_131 { public static void main(String[] args) {

// Khơ'i tạo ma'ng có kích thước 5 int size = 5; int[] array = new int[size];

// Gọi hàm nhập ma'ng inputArray(array);

// Gọi hàm xuấ&t ma'ng outputArray(array);

// Hàm nhập ma'ng public static void inputArray(int[] arr) {

Scanner scanner = new Scanner(System in );

System out println("Nhập vào các phấ>n tư' cu'a ma'ng:"); for (int i = 0; i < arr.length; i++) {

System out print("Phấ>n tư' thứ " + (i + 1) + ": "); arr[i] = scanner.nextInt();

// Đóng Scanner đê' tránh rò rỉ' bộ nhớ scanner.close();

// Hàm xuấ&t ma'ng public static void outputArray(int[] arr) {

System out println("Ma'ng sau khi nhập là:"); for (int i = 0; i < arr.length; i++) {

System out println("Phấ>n tư' thứ " + (i + 1) + ": " + arr[i]);

Kê&t qua' tra' vê> sau khi chạy chương trình:

Bài 127: Viết hàm sắp xếp mảng 1 chiều các số thực tăng dần. import java.util.*; public class Bai127 { public static void main(String args[]) {

Scanner sc = new Scanner(System in );

System out printf( "Nhap so phan tu trong mang: " , args ) ; int n = sc.nextInt(); int[] arr = new int[n];

System out printf( "Nhap cac phan tu trong mang: " , args ) ; for (int i = 0; i < n; i++){ arr[i] = sc.nextInt();

} for (int i = 0; i < n; i++){ for (int j = i+1; j < n; j++){ if (arr[i] > arr[j]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;

System out printf( "Mang sau khi duoc sap xep: " , args ) ; for (int i = 0; i < n; i++){

Kết quả trả về sau khi chạy chương trình:

Function to list even values in a 1-dimensional array of integers This function takes an array of integers as input and returns an array containing only the even values from the input array.

} public static void main(String args[]) {

Scanner sc = new Scanner(System in );

System out printf( "Nhap so phan tu trong mang: " , args ) ; int n = sc.nextInt(); int[] arr = new int[n];

System out printf( "Nhap cac phan tu trong mang: " , args ) ; for (int i = 0; i < n; i++){ arr[i] = sc.nextInt();

System out printf( "Cac phan tu la so chan trong mang la: " , args ) ; for (int i = 0; i < n; i++){ if (checkEven(arr[i]) == true){

Kết quả trả về sau khi chạy chương trình:

Bài 143: Viết hàm tìm số chẵn đầu tiên trong mảng các số nguyên Nếu mảng không có giá trị chẵn thì trả về -1. import java.util.*; public class Bai143 { private static boolean checkEven(int n){ if (n%2 != 0){ return false;

} public static int Even(int arr[]){ int ans = -1; for (int i = 0; i < arr.length ; i++){ if (checkEven(arr[i]) == true){ ans = arr[i]; break;

} public static void main(String args[]) {

Scanner sc = new Scanner(System in );

System out printf( "Nhap so phan tu trong mang: " , args ) ; int n = sc.nextInt(); int[] arr = new int[n];

System out printf( "Nhap cac phan tu trong mang: " , args ) ; for (int i = 0; i < n; i++){ arr[i] = sc.nextInt();

System out print("So chan dau tien trong mang la: " + ans);

Kết quả trả về sau khi chạy chương trình:

Bài 144: Tìm số nguyên tố đầu tiên trong mảng 1 chiều các số nguyên Nếu mảng không có số nguyên tố thì trả về – 1. import java.util.*; public class Bai144 { private static boolean checkPrime(int n){ boolean check = true; if (n 0){ b = b + 1;

System out println("Khoang gia tri [a,b] la: [" + a+"," + b+"]");

Kê&t qua' tra' vê> sau khi chạy chương trình:

Bài 158: Cho mảng 1 chiều các số thực, hãy tìm giá trị x sao cho đoạn [-x, x] chứa tất cả các giá trị trong mảng. import java.util.Scanner; public class Bai158 { public static void main(String[] args)

{ double[] array; array = new double[5];

Scanner sc = new Scanner(System in );

System out println(" -Mang co 5 phan tu -"); for(int i =0; i

Ngày đăng: 22/07/2024, 16:27

HÌNH ẢNH LIÊN QUAN

Bảng 1-1  Các phương thức của lớp String - đồ án môn học công nghệ java đề tài báo cáo bài tập lớn tuần 1
Bảng 1 1 Các phương thức của lớp String (Trang 17)
Bảng 1-2 liệt kê những phương thức hữu ích nhất của lớp StringBuilder. Lưu ý rằng lớp StringBuffer sử dụng các phương thức giống nhau - đồ án môn học công nghệ java đề tài báo cáo bài tập lớn tuần 1
Bảng 1 2 liệt kê những phương thức hữu ích nhất của lớp StringBuilder. Lưu ý rằng lớp StringBuffer sử dụng các phương thức giống nhau (Trang 25)
Bảng 3-1  Lớp ArrayList - đồ án môn học công nghệ java đề tài báo cáo bài tập lớn tuần 1
Bảng 3 1 Lớp ArrayList (Trang 54)
Bảng 3-2 Giao diện vòng lặp - đồ án môn học công nghệ java đề tài báo cáo bài tập lớn tuần 1
Bảng 3 2 Giao diện vòng lặp (Trang 59)

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w