Mảng trong Java và lớp ArrayList

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 70 - 74)

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" );

} }

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 70 - 74)