Mảng trong Java và lớp ArrayList

Một phần của tài liệu giáo trình về java 2008 (Trang 69)

II.1 Mảng trong Java

Trong phần “Ngụn ngữ Java căn bản” ta đó xem xột một biến mảng được khai bỏo và sử dụng như thế nào. Trong phần này ta sẽ đi sõu khai thỏc cỏc đặc tớnh của mảng và một số thuật toỏn thụng dụng thụng qua cỏc vớ dụ.

Vớ dụ: Đếm tần suất của cỏc phần tử của một mảng: import javax.swing.*;

public class StudentPoll { // Hàm main

{

// Khai bỏo một mảng cỏc cõu trả lời

int TraLoi[] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };

// Mảng đếm tần suất

int TanSuat[] = new int[ 11 ];

// Với mỗi phần tử của mang TraLoi, sử dụng giỏ trị đú như là chỉ số của mảng TanSuat sau đú đếm sự xuất hiện của nú trong TraLoi, lưu giỏ trị vào mảng TanSuat tại vị trớ tương ứng.

for ( int answer = 0; answer < TraLoi.length; answer++ ) ++frequency[ TraLoi[ answer ] ];

// Đưa kết quả vào một chuỗi

for ( int rating = 1; rating < TanSuat.length; rating++ ) output += rating + "\t" + TanSuat[ rating ] + "\n"; // In ra

System.out.print(out); } }

Trong vớ dụ này, cỏc cõu trả lời nằm trong khoảng từ 1 đến 10 nờn khai bỏo một mảng 11 phần tử để cú thể sử dụng chớnh giỏ trị 10 làm chỉ số của mảng. Chỉ cần duyệt mảng TraLoi 1 lần ta đó cú ngay kết quả.

II.2. Cỏc thuật toỏn cơ bản trờn mảng

Vớ dụ: Sắp xếp tuyến tớnh

Đõy là một vớ dụ sắp xếp cỏc phần tử của mảng tăng dần theo thuật toỏn “nổi bọt” - tức là sau mỗi vũng lặp duyệt, phần tử nào lớn nhất sẽ bị đẩy xuống cuối cựng.

// Sắp xếp cỏc phần tử của mảng public void bubbleSort( int array2[] ) {

// Duyệt qua mỗi phần tử của mảng

for ( int pass = 1; pass < array2.length; pass++ ) { // Vũng lặp so sỏnh và đổi chỗ

for ( int element = 0; element < array2.length - pass; element++ ) { // So sỏnh 2 phần tử liền kề và đổi chỗ nếu cần

if ( array2[ element ] > array2[ element + 1 ] ) swap( array2, element, element + 1 ); } }

}

// Hàm đổi chỗ 2 phần tử của một mảng

public void swap( int array3[], int first, int second ) {

int hold; // Biến trung gian để hoỏn đổi hold = array3[ first ];

array3[ first ] = array3[ second ]; array3[ second ] = hold;

Vớ dụ: Tỡm kiếm nhị phõn trờn mảng đó được sắp xếp:

Thụng thường việc tỡm kiếm diễn ra bằng phộp duyệt lần lượt cỏc phần tử của mảng. Ta gọi phương phỏp này là tỡm kiếm tuyến tớnh.

Đối với cỏc mảng đó được sắp xếp, ta cú một phương phỏp tỡm kiếm hiệu quả hơn, gọi là tỡm kiếm nhị phõn.

Giả sử ta cú một mảng: int[] b={1,5,7,8,34,56,67,89,100}; Đó được sắp xếp tăng dần.

Giả sử ta cần tỡm vị trớ của một phần tử cú giỏ trị 7. Trước tiờn, ta so sỏnh 7 với vị trớ đứng giữa của mảng là 34 thỡ 7 < 34 nờn ta chắc chắn nếu cú thỡ 7 sẽ nằm ở nửa trước của mảng. Tiếp tục làm việc này với nửa trước của mảng, so sỏnh 7 với 5 thỡ 7>5 nờn phần tử cần tỡm nếu cú sẽ nằm ở phần sau của nửa này gồm 2 phần tử 7,8. Lần phõn đụi cuối cựng này cho ta kết quả.

Thủ tục này được cài đặt như sau:

public int binarySearch( int array2[], int key ) {

int low = 0; // Chỉ số dưới

int high = array.length - 1; // Chỉ số trờn int middle; // chỉ số của phần tử trung gian

// Lặp cho đến khi chỉ số dưới lớn hơn hoặc bằng chỉ số trờn while ( low <= high ) {

// Xỏc định chỉ số phần tử giữa middle = ( low + high ) / 2;

// Nếu khúa cần tỡm trựng với phần tử giữa thỡ trả về kết quả ngay if ( key == array[ middle ] )

return middle;

// Nếu khúa nhở hơn phần tử giữa, đặt lại chỉ số trờn else if ( key < array[ middle ] )

high = middle - 1;

// Khúa lớn hơn phần tử giữa, đặt lại chỉ số dưới else

low = middle + 1; }

return -1; // Khụng tỡm thấy }

II.3 Class Arrays

Java hỗ trợ một lớp mảng trong thư viện java.util.Arrays để lập trỡnh viờn thao tỏc trờn mảng. Chủ yếu cỏc phương thức của lớp này là static. Thay vỡ phải lập trỡnh, Arrays hỗ trợ cỏc phương thức:

 fill: để nạp giỏ trị cho mảng.  sort: để sắp xếp mảng

 equals: So sỏnh mảng

Sau đõy là vớ dụ về sử dụng lớp Arrays: import java.util.*;

public class UsingArrays {

private int intValues[] = { 1, 2, 3, 4, 5, 6 };

private double doubleValues[] = { 8.4, 9.3, 0.2, 7.9, 3.4 }; private int filledInt[], intValuesCopy[];

// Khởi tạo cỏc mảng public UsingArrays() {

filledInt = new int[ 10 ];

intValuesCopy = new int[ intValues.length ];

Arrays.fill( filledInt, 7 ); // Nạp giỏ trị cho mảng filledInt với giỏ trị 7 Arrays.sort( doubleValues ); // Sắp xếp mảng doubleValues

System.arraycopy( intValues, 0, intValuesCopy, 0, intValues.length ); // Sao chộp mảng }

// In giỏ trị của cỏc mảng public void printArrays() {

System.out.print( "doubleValues: " );

for ( int count = 0; count < doubleValues.length; count++ ) System.out.print( doubleValues[ count ] + " " );

System.out.print( "\nintValues: " );

for ( int count = 0; count < intValues.length; count++ ) System.out.print( intValues[ count ] + " " );

System.out.print( "\nfilledInt: " );

for ( int count = 0; count < filledInt.length; count++ ) System.out.print( filledInt[ count ] + " " );

System.out.print( "\nintValuesCopy: " );

for ( int count = 0; count < intValuesCopy.length; count++ ) System.out.print( intValuesCopy[ count ] + " " );

System.out.println(); }

// Tỡm một giỏ trị trong mảng intValues public int searchForInt( int value )

{

return Arrays.binarySearch( intValues, value ); }

// So sỏnh nội dung mảng public void printEquality() {

boolean b = Arrays.equals( intValues, intValuesCopy );

System.out.println( "intValues " + ( b ? "==" : "!=" ) + " intValuesCopy" ); b = Arrays.equals( intValues, filledInt );

System.out.println( "intValues " + ( b ? "==" : "!=" ) + " filledInt" ); }

// Hàm main

public static void main( String args[] ) {

UsingArrays usingArrays = new UsingArrays(); usingArrays.printArrays();

usingArrays.printEquality();

int location = usingArrays.searchForInt( 5 );

System.out.println( ( location >= 0 ? "Tỡm thấy 5 tại vị trớ " + location : "Khụng thấy" ) + " trong mảng intValues" );

location = usingArrays.searchForInt( 8763 );

System.out.println( ( location >= 0 ? "Tỡm thấy 8763 tại " + location : "Khụng thấy 8763" ) + " trong mảng intValues" );

} }

III Danh sỏch trong java và giao diện Lists

Lists là một chuỗi cú thứ tự cỏc phần tử cho phộp cỏc phần tử cú thể giống nhau. Lists là một giao diện kế thừa giao diện Collections nờn nú cho phộp lập trỡnh viờn truy cập cỏc phần tử qua chỉ số. Cỏc lớp tập hợp cài đặt Lists là ArrayList, LinkedList và Vector.

ArrayList là một lớp tập hợp cú thể thay đổi kớch thước. Về cơ bản thỡ ArrayList giống với Vector chỳng ta đó xem xột ở trờn.

Sau đõy là chương trỡnh vớ dụ sử dụng ArrayList. Ở đõy ta đặt cỏc đối tượng String và Color vào cựng một ArrayList sau đú xúa đi cỏc phần tử String sử dụng một đối tượng Iterator.

import java.awt.Color; import java.util.*;

public class CollectionTest {

private String colors[] = { "red", "white", "blue" }; // Tạo một ArrayList, thờm cỏc phần tử cho nú public CollectionTest()

{

ArrayList list = new ArrayList(); // Thờm đối tượng cho nú

list.add( Color.magenta ); // Thờm một đối tượng Color // Thờm cỏc đối tượng String

for ( int count = 0; count < colors.length; count++ ) list.add( colors[ count ] );

list.add( Color.cyan ); // Thờm một đối tượng Color // In ra nội dung

System.out.println( "\nArrayList: " );

for ( int count = 0; count < list.size(); count++ ) System.out.print( list.get( count ) + " " ); // Xúa tất cảcỏc đối tượng String

removeStrings( list ); // output list contents

System.out.println( "\n\nArrayList sau khi gọi removeStrings: " ); for ( int count = 0; count < list.size(); count++ )

System.out.print( list.get( count ) + " " ); }

public void removeStrings( Collection collection ) {

// Khai bỏo đối tượng iterator

iterator iterator = collection.iterator(); // Lặp trong khi tập hợp vẫn cũn phần tử while ( iterator.hasNext() )

if ( iterator.next() instanceof String ) iterator.remove(); // Xúa phần tử }

// Hàm main

public static void main( String args[] ) {

new CollectionTest(); }

}

Bài tập

1. Viết chương trỡnh quản lý danh sỏch một lớp học với cỏc chức năng - Tỡm kiếm sinh viờn

- Thờm sinh viờn. - Xúa sinh viờn

- Sắp xếp danh sỏch theo tờn

2. Viết chương trỡnh nhập vào n số nguyờn và số thực, n nhập từ bàn phớm. Sau đú: - Tớnh tổng của n số này.

- Sắp xếp n số theo thứ tự tăng dần

Đề tài 6. Cỏc luồng vào ra dữ liệu với file

Một khả năng quan trọng mà cỏc ngụn ngữ lập trỡnh phải cú là việc quản lý cỏc luồng dữ liệu vào ra hệ thống mỏy tớnh giỳp cỏc chương trỡnh cú thể giao tiếp dữ liệu với thế giới bờn ngoài.

I. Khỏi niệm luồng vào ra (I/O stream)

Luồng là dũng chảy của dữ liệu. Cú 2 loại luồng:

 Luồng nhập (input stream): là tất cả gỡ từ thế giới bờn ngoài được đưa vào mỏy tớnh, như đọc từ bàn phớm, đọc từ tập tin...

 Luồng xuất (output stream): là tất cả những gỡ được gửi từ mỏy tớnh ra ngoài thụng qua cỏc thiết bị ngoại vi, như màn hỡnh, mỏy in, tệp tin, ...

Đối với mội luồng lại cú cỏc dũng bao gồm:

 Lớp System.out: Dũng xuất chuẩn dựng để hiển thị kết quả trờn màn hỡnh.

 Lớp System.in: Dũng nhập chuẩn thường đến từ bàn phớm và được dựng để đọc cỏc ký tự dữ liệu.

 Lớp System.err: Đõy là dũng lỗi chuẩn cho phộp một chương trỡnh đưa ra cỏc thụng bỏo lỗi trờn màn hỡnh.

Cỏc dũng này cú thể bị đổi hướng đến nhiều nguồn khỏc nhau. Vớ dụ System.err cú thể đưa thụng bỏo lỗi ra một file.

Khi cần làm việc với luồng, ta khai bỏo khối thư viện: import java.io.*;

Thư viện này cho phộp ta làm việc với cỏc luồng nhập xuất qua việc cung cấp cỏc lớp: FileInputStrem, FileOutputStream, FileReader, FileWriter và rất nhiều lớp khỏc.

Sự phõn cấp cỏc class trong gúi java.io thể hiện qua bảng sau: java.lang.Object File FileDescriptor InputStream ByteArrayInputStream FileInputStream FilterInputStream BufferedInputStream DataInputStream PushbackInputStream ObjectInputStream PipedInputStream SequenceInputStream OutputStream ByteArrayOutputStream FileOutputStream FilterOutputStream BufferedOutputStream DataOutputStream PrintStream ObjectOutputStream

PipedOutputStream RandomAccessFile Reader BufferedReader LineNumberReader CharArrayReader FilterReader PushbackReader InputStreamReader FileReader PipedReader StringReader Writer BufferedWriter CharArrayWriter FilterWriter OutputStreamWriter FileWriter PipedWriter PrintWriter StringWriter

Sau đõy chỳng ta xem xột cỏc class quan trọng thường được sử dụng:

II. Lớp InputStream:

Là một lớp trừu tượng định nghĩa cỏch thức nhận dữ liệu. Cú cỏc phương thức chớnh sau:  read(): Đọc cỏc byte dữ liệu từ một dũng. Nếu như khụng cú byte dữ liệu nào, nú

phải chờ. Khi một phương thức phải chờ, cỏc luồng đang thực hiện phải tạm dừng cho đến khi cú dữ liệu.

 read(byte[]): Trả về số byte đọc được hay „-1‟ nếu như đó đọc đến cuối dũng. Nú gõy ra ngoại lệ IOException nếu cú lỗi xảy ra.

 read(byte[],int,int): Nú cũng đọc vào một mảng byte. Nú trả về số byte thực sự đọc được cho đến khi kết thỳc dũng. Nú gõy ra ngoại lệ IOException nếu lỗi xảy ra.  available(): Phương phỏp này trả về số lượng byte cú thể đọc được mà khụng phải

chờ. Nú trả về số byte hiện tại cú trong dũng. Nú khụng phải là phương thức tin cậy để thực hiện tiến trỡnh xử lý đầu vào.

 close(): Phương thức này đúng dũng. Nú dựng để giải phúng mọi tài nguyờn dũng đó sử dụng. Luụn luụn đúng dũng để chắc chắn rằng dũng xử lý được kết thỳc. Nú gõy ra ngoại lệ IOException nếu lỗi xảy ra.

 mark(): Đỏnh dấu vị trớ hiện tại của dũng.

 markSupported(): Trả về giỏ trị boolean chỉ ra rằng dũng cú hỗ trợ cỏc khả năng mark và reset hay khụng. Nú trả về true nếu dũng hỗ trợ ngược lại trả về false.  reset(): Phương thức này định vị lại dũng theo vị trớ được đỏnh lần cuối cựng. Nú

gõy ra ngoại lệ IOException nếu lỗi xảy ra.

 skip(): Phương thức này bỏ qua „n‟ byte dũng vào. ‟-n‟ chỉ định số byte được bỏ qua. Nú gõy ra ngoại lệ IOException nếu lỗi xảy ra. Phương thức này sử dụng để di chuyển tới vị trớ đặc biệt bờn trong dũng vào.

III. Lớp OutputStream

Là lớp trừu tượng định nghĩa cỏch ghi cỏc kết xuất đến dũng. Nú cung cấp một tập cỏc phương thức trợ giỳp tạo ra, ghi và xử lý kết xuất cỏc dũng. Cỏc phương thức bao gồm:

 write(int): Phương thức này ghi một byte.

 write(byte[]): Phương thức này phong toả cho đến khi một byte được ghi. Dũng phải chờ cho đến khi tỏc vụ ghi hoàn tất. Nú gõy ra ngoại lệ IOException nếu lỗi xảy ra.

 write(byte[], int, int): Phương thức này ghi mảng cỏc byte. Lớp OutputStream định nghĩa ba dạng khỏc nhau của phương thức để cú thể ghi một byte riờng lẻ, một mảng cỏc byte, hay một đoạn của một mảng byte.

 flush(): Phương thức này xả sạch dũng. Đệm dữ liệu được ghi ra dũng. Nú kớch hoạt IOException nếu lỗi xảy ra.

 close(): Phương thức đúng dũng. Nú được dựng để giải phúng mọi tài nguyờn gắn với dũng. Nú kớch hoạt IOException nếu lỗi xảy ra.

IV. Lớp FileInputStream

Kế thừa từ InputStream, lớp này cho phộp đọc vào từ một tập tin dưới dạng một stream. Cỏc đối tượng của lớp này được tạo ra nhờ đường dẫn tới file, đối tượng File, hoặc đối tượng FileDescriptor làm một đối số.

Lớp này cú 3 phương thức khởi tạo sau:

 FileInputStream(String name): Tham số là tờn của tập tin để tạo luồng.  FileInputStream(File f): Tham số là đối tượng file để tạo luồng.

 FileInputStream(FileDescriptor fdObj): Tham số là đối tượng FileDescriptor để tạo luồng.

Vớ dụ:

InputStream in = new FileInputStream(“C:\\LETI\\JAVA\\Account.txt”);

V. Lớp FileOutputStream

Lớp này cung cấp khả năng ghi dữ liệu xuống tập tin, được dẫn xuất từ lớp cha OutputStream.

Cú 3 phương thức khởi tạo:

 FileOutputStream(String name);  FileOutputStream(File f);

 FileOutputStream(FileDescriptor fdObj)

VI. Lớp File

Lớp này được sử dụng để truy cập cỏc đối tượng tập tin và thư mục. Cỏc tập tin đặt tờn theo qui ước đặt tờn tập tin của hệ điều hành. Lớp này cung cấp cỏc phương thức thiết lập cỏc tập tin và cỏc thư mục. Tất cả cỏc thao tỏc thư mục và tập tin được thực hiện thụng qua cỏc phương thức của lớp File. Như vậy, ta dựng File trong tất cả cỏc thao tỏc quản lý file và thư mục.

Cú 3 cỏch để tạo cỏc đối tượng từ lớp File:  File(String path);

 File(String path, String name);  File(File dir, String name);

hoặc

File f = new File("C:\jdk1.4\bin", "hello.java"); hoặc

File curDir = new File(".");

File f = new File(curDir, "Hello.java"); Cỏc phương thức:

 public String getName(): lấy tờn đối tượng tập tin.  public String gePath(): lấy đường dẫn của tập tin.

 public String getAbsolutePath(): lấy đường dẫn tuyệt đối của tập tin.  public String getParent(): lấy tờn thư mục cha.

 public Boolean createNewFile(): tạo một tập tin mới.

 public void createTempFile(String pattern, File dir): tạo tập tin tạm thời.  public void deleteOnExit(): yờu cầu xoỏ tập tin khi chương trỡnh chấm dứt.  public boolean canWrite(): cho biết tin cú cho phộp ghi hay khụng (true nếu cú).  public boolean canRead(): cho biết tập tin được phộp đọc hay khụng (true nếu cú)  public void setReadOnly(): đặt thuộc tớnh chỉ đọc.

 public boolean isFile(): cho biết tệp tin cú hợp lệ hay khụng (true nếu cú).

 public boolean isDirectory(): cho biết tập tin cú phải thư mục hay khụng (true nếu cú).

 public boolean isHidden(): kiểm tra xem tập tin cú ẩn hay khụng (true nếu cú).  public long length(): cho biết kớch thước tập tin (byte).

 public boolean mkdir(): tạo một thư mục từ đối tượng file, true nếu thành cụng.  renameTo(File dest): đổi tờn tập tin hiện tại sang tờn mới.

 public String[ ] list(): lấy danh sỏch cỏc tập tin và thư mục.

 public String[ ] list(FilenameFilter filter): lấy danh sỏch tập tin thoả món điều kiện lọc, vớ dụ *.gif.

 public booean delete(): xoỏ tập tin, true nếu xoỏ thành cụng.  public String toString(): trả về đường dẫn của tập tin.

 public String toURL(): trả về đối tượng URL tương ứng với tập tin. Chương trỡnh vớ dụ:

public class Test {

public static void main(String args[]) {

File f = new File("test");

System.out.println(f.getAbsolutePath()); // Lấy đường dẫn tuyệt đối System.out.println(f.exists()); // Kiểm tra sự tồn tại

} }

VII. Nhập xuất lọc

Là một kiểu dũng cú được từ việc thay đổi cỏch xử lý dũng hiện cú. Cỏc lớp, cỏc dũng nhập xuất lọc của java sẽ giỳp ta lọc vào/ra theo một số cỏch.

Bộ lọc nằm giữa một dũng nhập và một dũng xuất. Nú thực hiện xử lý một quỏ trỡnh nào đú trờn cỏc byte được truyền từ đầu vào đến đầu ra.

Cỏc bộ lọc cú thể ghộp với nhau khi đú đầu ra của bộ lọc này trở thành đầu vào của bộ lọc kia.

VII.1 Lớp FilterInputStream:

Đõy là lớp trừu tượng. Nú là cha của tất cả cỏc lớp dũng nhập lọc. Một dũng cú thể được đọc và đưa kết quả cho một dũng khỏc.

Lớp FilterInputStream được thiết kế sao cho cú khả năng kết chuỗi nhiều bộ lọc. Để thực hiện điều này chỳng ta dựng vài tầng lồng nhau.

VII.2 Lớp FilterOutputStream

Lớp này là một dạng bổ trợ cho lớp FilterInputStream. Nú là lớp cha của tất cả cỏc lớp

Một phần của tài liệu giáo trình về java 2008 (Trang 69)

Tải bản đầy đủ (PDF)

(146 trang)