[Tự học lập trình Java] Bài 4: Mảng và chuỗi trong Java

[Tự học lập trình Java] Bài 4: Mảng và chuỗi trong Java

1. Mảng 1 chiều

1.1. Khai báo và tạo mảng
  Mảng được dùng để lưu trữ các khoản mục (items) cùng kiểu dữ liệu liền kề nhau trong bộ nhớ. Mỗi lần ta khai báo kích thước của một mảng, nó sẽ không thể thay đổi. Dữ liệu trên mảng có thể là kiểu dữ liệu nguyên thuỷ hoặc đối tượng. Cũng như các biến, ta có thể gán các giá trị vào mảng tại các phần tử được tạo ra trong mảng. Nếu không, Java sẽ gán giá trị mặc định vào tất cả các phần tử của mảng, giá trị mặc định phụ thuộc vào kiểu dữ liệu. Ví dụ : nếu kiểu dữ liệu là nguyên (int) thì giá trị mặc định ban đầu sẽ là 0.


Mảng có thể được khai báo bằng 3 cách :


Cách khai báo
Mô tả
Cú pháp
Ví dụ
Chỉ đơn thuần khai báo
Chỉ đơn thuần khai báo mảng
Datatype  identifier[]
char ch[ ];
//khai báo mảng ký tự có tên ch
Khai báo và tạo mảng
Khai báo và cấp phát bộ nhớ cho các phần tử mảng sử dụng toán tử  “new”
Datatype  identifier[]
= new datatype [size ]
char ch[] = new
char [10 ];
//Khai báo một mảng ch và lưu trữ 10 ký tự
Khai báo, kiến tạo và khởi tạo
Khai báo mảng, cấp phát bộ nhớ cho nó và gán các giá trị ban đầu cho các phần tử của mảng
Datatype  identifier[]
= {value1,value2…};
char ch []
= {‘A’,’B’,’C’,’D’ };
//khai báo mảng ch và lưu 4 chữ cái kiểu  ký tự

Để xác định tên và số phần tử của mảng ta cần xem xét các phần tử mảng.Số phần tử bắt đầu với 0 cho phần tử đầu,1 cho phần tử thứ hai và cứ tiếp như vậy.

1.2. Sắp xếp mảng
     Sử dụng các thuật toán sắp xếp như: Thuật toán đổi chỗ trực tiếp, thuật toán nổi bọt, thuật toán chèn trực tiếp, thuật toán vun đống, …
    Ứng dụng các thuật toán trên để sắp xếp dãy số (mảng số) theo chiều tăng dần, hoặc giảm dần với dãy số nhập vào từ bàn phím.

1.3. Mảng đối tượng

   Tương tự như mảng dữ liệu thông thường. Chúng ta có thể khai báo các mảng đối tượng từ các lớp đã được định nghĩa.

Ví dụ:
 // khai bao lớp
class A{
   // khai báo thuộc tính
   // phương thức
   …
}
// khai báo mảng đối tượng m có kích thước là 10.
A[] m=new A[10];

//Để sử dụng được mảng m ta phải khởi tạo từng đối tượng là thành phần của mảng //(thường sử dụng cấu trúc lặp).

1.4. Mảng đa chiều.
    Các mảng đa chiều trong Java được coi như là các mảng đối tượng chứa các tham chiếu đến các mảng khác
   Số chiều được quy định bởi số cặp ngoặc vuông [].

Ví dụ:
  - Bộ khởi tạo mảng cho mảng hai chiều:
   int[][] mac1 = { { 1, 2, 3, }, { 4, 5, 6, } };
  - Một mảng động được tạo ra.
   int[][] mac2 = new int[n][m];
  - Một mảng với các véc-tơ có kích thước khác nhau. Mảng phụ w xác định độ dài của các véc-tơ này.

Ví dụ:
  public class MultiArr {
   public static void main(String[] arg) {
     int w[] = { 2, 3, 4 };
     int n = 3;
     int[][] m3 = new int[n][]; // sizes of the rows are set dynamically
     for(int i = 0; i < m3.length; i++) {
       m3[i] = new int[w[i]];
       for (int j = 0; j < m3[i].length; j++)
          m3[i][j] = i + j;
      }
     for (int i = 0; i < m3.length; i++) {
       System.out.println("Size of the " + i + "-th row " + m3[i].length);
       String out = " ";
       for(int j = 0; j < m3[i].length; j++) out += " " + m3[i][j];
           System.out.println(out);
     }
  }
}

Kết quả:
 Size of the 0-th row 2
  0 1
Size of the 1-th row 3
  1 2 3
Size of the 2-th row 4
  2 3 4 5


2. Chuỗi (string)
   Chuỗi là tập các kí tự đứng liền nhau được giới hạn trong dấu ngoặc kép như: "hello word", "laptrinhmaytinh.net",...

2.1. Khai báo và khởi tạo Java cung cấp các kiểu khai báo và khởi tạo string như sau:
 - Khai báo một xâu rỗng
 Ví dụ: String str1=new String( ); //khởi tạo str1 là một xâu trống

- Khai báo và khởi tạo một xâu bằng một chuỗi cho trước.
Ví dụ: String str2=new String(“Hello word”); //khởi tạo str2 bằng “Hello word”

- Khai báo và khởi tạo một xâu bằng một mảng kí tự cho trước.
Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’}; String str3=new String[ch];

Kết quả str3 là xâu “abcde”· Khai báo và khởi tạo một xâu bằng cách chọn một vài kí tự trong một mảng kí tự cho trước.

Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’};
           String str4=new String[ch,0,2];

Kết quả str4 là xâu ab, vì khởi tạo này sẽ khởi tạo xâu str4 là lấy 2 kí tự từ vị trí thứ 0.

2.2. Thao tác nối chuỗi (cộng 2 chuỗi)
- Cộng 2 chuỗi bằng dấu cộng (+)
Ví dụ: String str1=new String(“Hello word” );
           System.out.printf(“toi muon noi ”+str1);

Kết quả của đoạn mã trên sẽ in ra dong chữ: “toi muon noi Hello word”

Chú ý: Java có khả năng tự chuyển bất cứ dữ liệu kiểu số nào khi cộng vào String.

Ví dụ: int n=100;
           Float m=100.123;
           System.out.printf(“so nguyen la ”+n+”so thuc la “+m);

     Kết quả sẽ in ra chuỗi số: “so nguyen la 100 so thuc la 100.123”có nghĩa là java sẽ chuyển n và m thành kiểu string rồi sau đó sẽ nối vào chuỗi phía trước.
     Khi cộng chuỗi bằng dấu cộng ,kết quả sẽ đưa ra bằng cách nỗi 2 chuỗi vào vị trí cuối cùng của chuỗi đầu tiên. Cách nối chuỗi này thường được sử dụng khi in ra màn hình hoặc chuyển kiểu dữ liệu số sang string.

- Nối 2 chuỗi bằng phương thức concat( )
   Khác với việc nối chuỗi bằng dấu cộng là nối 2 chuỗi tại vị trí cuối cùng của chuỗi đầu tiên.thay vào đó phương thức này sẽ trả về một chuỗi mới.

Ví dụ: String str1,str2,str3;
           str1=”"Welcome”";
           str2=”"laptrinhmaytinh.net";
           str3=str1.concat(str2);

 Kết quả là str3 sẽ bằng “Welcome laptrinhmaytinh.net

2.3. Các hàm xử lí với chuỗi trong java
- substring
 Ví dụ: String str1=new String( “Ha noi” );
            String str2=str1.substring(0,2);

Kết quả là str2 bằng “Ha có nghĩa là phương thức substring sẽ lấy 2 kí tự trong xâu str1 bắt đầu từ kí tự thứ 0.

- length trả về độ dài chuỗi
Ví dụ: String str1=new String(“”Ha Noi””);
          int n=str1.length( );

Kết quả là n=6 nghĩa là phương thức length( ) sẽ trả về độ dài xâu kí tự

- charAt
Ví dụ: String str1=new String(“”dantri.vn””);
           char ch=str1.charAt(3);
Kết quả là ch=’'n'’ nghĩa là phương thức charAt( 3) sẽ trả về kí tự thứ 3 tính từ vị trí thứ 0 trong xâu str1

- equals: phương thức này so sánh 2 chuỗi.kết quả trả về có kiểu Boolean
Ví dụ: String str1=new String(“”hello””);
           String str2=new String(“”ITOP””);
           boolean k=str1.equals(str2);

Kết quả trả về là k=false nghĩa là phương thức equals sẽ so sánh từng kí tự trong 2 chuỗi.

Chú ý là trong Java có phân biệt kiểu chữ hoa và chữ thường như:”iTop”#”ITOP”

- compareTo:
So sánh 2 chuỗi lần lượt thứ tự từng kí tự của 2 chuỗi nghĩa là: int
Ví dụ:
a=str1.compareTo(str2);
a=0 nếu s2=s1
a>0 nếu s2>s1
a<0 nếu s2<s1

Ví dụ: String str1=new String(“kc”);
           String str2=new String(“kavcb”);
           int a=str1.compareTo(str2);\\ kết quả là a>0 vì “kc”>”kavcb”

- toCharArray
Là phương thức đổi chuỗi thành mảng kí tự.

Ví dụ: String str1==new String(“itop.vn”);
           char [ ] ch=str1.toCharArray( ); //

//kết quả là mảng ch={‘i’,’t’,’o’,’p’,’.’,’v’,’n’}

- indexOf
Ví dụ:
        String str1=new String( “laptrinhmaytinh.net”);
        String str2=new String("lap");
        String str3=new String("may");
        int n=str1.indexOf(str2);
        int m=str1.indexOf(str3);
        //kết quả là n=0 và m=8 nghĩa là phương thức này sẽ trả về vị trí của chuỗi str2 và str3 trong chuỗi str1, nếu không tìm thấy sẽ trả về giá trị -1

- startsWith( )
Trả về giá trị kiểu Boolean

Ví dụ: String str1=”hoc.itop.vn”;
           String str2=”hoc”;
           boolean k=str1.startsWith(str2);

Kết quả là k=true nghĩa là phương thức này sẽ kiểm tra xem chuỗi một có bắt đầu bằng chuỗi 2 hay không

- endsWith( )
   Cũng như hàm startsWith( ) kết quả trả về là kiểu boolean.
Ví dụ: String str1=”"laptrinhmaytinh.net";
           String str2=”"vn"”;
           boolean k=str1.endsWith(str2);
           // Kết quả là k=false nghĩa là hàm này sẽ kiểm tra xem chuỗi str1 có kết thúc là chuỗi str2 hay không.

- copyValueOf( )
Phương thức này trả về một chuỗi được rút ra từ một mảng kí tự.

Ví dụ: char ch[ ]={‘a’,’b’,’c’,’d’,’e’};
           String str1=String.copyValueOf(2,2);
           //Kết quả là str1=”cd” nghĩa là xâu str1 được rút ra từ mảng ch bằng cách lấy 2 phần tử của mảng và lấy từ vị trí thứ 2.

- toUpperCase( )
 Phương thức này sẽ trả về chữ hoa của chuỗi

Ví dụ: String str1=”"hello”";
           String str2=str1.toUpperCase( );
           //Kết quả là str2 = "”HELLO”";

- toLowerCase( )
   Phương thức này sẽ trả về chữ thường của chuỗi

Ví dụ: String str1=”"Hello”";
           String str2=str1.toLowerCase( );
           //Kết quả là str2="”hello"”;

- Chuyển kiểu dữ liệu từ String sang số các phương thức chuyển kiểu dữ liệu từ String sang số nằm trong gói thư viện java.lang ta có bảng các phương thức như sau:


Ví dụ: String str1=new String(“124”);
           int n=Integer.parseInt(str1);
           //Kết quả là n=124

3. Ví dụ minh hoạ

Ví dụ 1:
- Yêu cầu: Viết chương trình nhập ký tự từ bàn phím
- Code:

import java.io.*;
/* gói này cung cấp thự viện xuất nhập hệ thống thông qua những luồng dữ //liệu và hệ thống file.*/
class InputChar
{
  public static void main(String args[])
  {
    char ch = ' ';
    try
   {
     ch = (char) System.in.read();
   }
   catch(Exception e)
  {
    System.out.println("Nhập lỗi!");
   }
   System.out.println("Ky tu vua nhap:" + ch);
  }
 }


Kết quả:
a
Ky tu vua nhap:a


Ví dụ 2: Nhập dữ liệu số

import java.io.*;
 class inputNum
 {
  public static void main(String[] args)
  {
    int n=0;
    try
    {
     BufferedReader in = new BufferedReader(new InputStreamReader(
     System.in));
     String s;
    s = in.readLine();
    n = Integer.parseInt(s);
  }
  catch(Exception e)
  {
   System.out.println(“Nhập dữ liệu bị lỗi !”);
  }
  System.out.println(“Bạn vừa nhập số:” + n);
 }
}

Ví dụ 3: Nhập và xuất giá trị các phần tử của một mảng các số nguyên.

class ArrayDemo
{
  public static void main(String args[])
  {
   int arrInt[] = new int[10];
   int i;
   for(i = 0; i < 10; i = i+1)
      arrInt[i] = i;
   for(i = 0; i < 10; i = i+1)
      System.out.println("This is arrInt[" + i + "]: " + arrInt[i]);
   }
 }

Ví dụ 4: Tìm phần tử có giá trị nhỏ nhất (Min) và lớn nhất (Max) trong một mảng.

//class tìm max, min - cách 1
public class MinMax
{
  public static void main(String args[])
  {
    int nums[] = new int[10];
    int min, max; nums[0] = 99; nums[1] = -10;
    nums[2] = 100123; nums[3] = 18; nums[4] = -978;
    nums[5] = 5623; nums[6] = 463;
    nums[7] = -9; nums[8] = 287;
    nums[9] = 49; min = max = nums[0];
    for(int i=1; i < 10; i++)
    {
      if(nums[i] < min) min = nums[i];
      if(nums[i] > max) max = nums[i];
     }
    System.out.println("min and max: " + min + " " + max);
  }
}

// class tìm max, min - cách 2
public class MinMax2
{
public static void main(String args[])
{
   int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 };
   int min, max;
   min = max = nums[0];
   for(int i=1; i < 10; i++)
   {
      if(nums[i] < min) min = nums[i];
      if(nums[i] > max) max = nums[i];
   }
   System.out.println("Min and max: " + min + " " + max);
 }
}

Ví dụ 5: Sắp xếp mảng dùng phương pháp sắp xếp nổi bọt (Bubble Sort)

public class BubbleSort
 {
  public static void main(String args[])
 {
   int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 };
   int a, b, t;
   int size;
   size = 10; // number of elements to sort
   // display original array
   System.out.print("Original array is:");
   for(int i=0; i < size; i++)
      System.out.print(" " + nums[i]);
   System.out.println();
   // This is the Bubble sort.
   for(a=1; a < size; a++)
       for(b=size-1; b >= a; b--)
        {
             if(nums[b-1] > nums[b])
               { // if ou of order
                  // exchange elements
                  t = nums[b-1];
                  nums[b-1] = nums[b];
                  nums[b] = t;
                 }
          }
// display sorted array
 System.out.print("Sorted array is:");
 for(int i=0; i < size; i++)
    System.out.print(" " + nums[i]);
  System.out.println();
 }
}

Ví dụ 6: Nhập và xuất giá trị của các phần tử trong một mảng hai chiều.

public class TwoD_Arr
{
   public static void main(String args[])
   {
      int t, i;
      int table[][] = new int[3][4];
      for(t=0; t < 3; ++t)
      {
           for(i=0; i < 4; ++i)
           {
              table[t][i] = (t*4)+i+1;
              System.out.print(table[t][i] + " ");
            }
            System.out.println();
        }
  }
}

// Xem thêm ví dụ về mảng tại đây 


Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Tài liệu: Lập trình hướng đối tượng JAVA core dành cho người mới bắt đầu học lập trình [Click để xem]

# Khoá học online: Lập trình Java trong 4 tuần [Click để xem]


--------------------------------------------------- 

Đọc thêm các bài khác:

Bài 1: Chương trình JAVA đầu tiên
Bài 2: Các kiểu dữ liệu và toán tử trong
Bài 3: Các cấu trúc điều khiển trong Java
Bài 4 : Mảng và chuỗi trong Java
Bài 5: Lớp (class) và đối tượng (object) trong Java
Bài 6:Thừa kế (Inheritance) và đa hình (Polymorphism)
Ví dụ lập trình giao diện đồ họa với Java (GUI)
Ví dụ lập trình kết nối dữ liệu với Java (JDBC)
Ví dụ về lập trình Android