Thực hành với mảng (Array)


Bài số 4 của Blog Android cơ bản: http://wp.me/p6SFw5-rk

Nội dung đạt được

– Tìm hiểu về Array, duyệt mảng, thuật toán sắp xếp.
– Tìm hiểu ScrollView
– Cách khai thác resource hình ảnh.

==Array==

1. Khái niệm

Mảng là tập hợp các phần tử có cùng 1 kiểu. Kích thước của mảng là số phần tử mà mảng đó có thể lưu trữ được. Kích thước của mảng không thay đổi được trong suốt quá trình thực thi mã. Mảng trong java là dạng đối tượng nên phải dùng từ khóa new để khởi tạo.

Ngoài ra, để củng cố kiến thức về mảng, bạn cần tự ôn luyện, tìm hiểu thêm.

*Khai báo mảng 1 chiều:

kieudulieu ten-mang= new kieudulieu[kichthuoc] ;

Ví dụ:

int myArray[] ; // khai báo mảng
myArray =new int[8]; // cấp phát 8 phần tử cho mảng
//hoặc gọn hơn:
int myArray[]= new int [8]; //khai báo và cấp phát

2. Gán giá trị mảng

Muốn truy xuất phần tử ta dựa vào index (chỉ số). Index bắt đầu từ 0 nên nếu mảng có 8 phần tử thì index sẽ từ 0 đến 7.

Ví dụ:

int myArray[] =new int[8];
MyArray[0]=5;
MyArray[1]=543;
MyArray[2]=6;
//…
//hoặc có thể gán giá trị như sau:
int myArray[] ={5,543,6};

Chúng ta có thể tưởng tượng ra mảng như hình sau:
and1

3. Duyệt phần tử

Để duyệt qua từng phần tử của mảng, ta dùng for kết hợp với thuộc tính .length

String chuoi= “”;
for(int i=0;i<myArray.length;i++)
 chuoi+= myArray[i] + “”;

4. Sắp xếp mảng

– Dùng hàm:   Arrays.sort(myArray);
– Dùng thuật toán (thông qua biến tạm, nếu phần tử thứ i > phần tử thứ j thì ta đổi chỗ chúng với nhau):

for (int i=0;i<myArray.length;i++)
   for(int j=i;j<myArray.length;j++) { if(myArray[i] >myArray[j])
     {
       int temp= myArray[i];
       myArray[i]=myArray[j];
       myArray[j]=temp;
     }
   }

5. Mảng 2 chiều

– Khai báo mảng:
 kieu-du-lieu ten-mang[][]= new kieu-du-lieu[sodong][socot] ;

Ví dụ Khai báo mảng:

int myArray2[][] ; // khai báo mảng
myArray[][] =new int[2][3]; // mảng 2 chiều với 2 dòng 3 cột
//hoặc gọn hơn: 
int myArray2[][]= new int [2][3];

Ví dụ Gán giá trị mảng 2 chiều:

int myArray2[][]={
                   {1,2,3},         
                   {6,8,84},
                 } ; // khai báo mảng và gán giá trị
//hoặc

int myArray2[][]= new int [2][3];
myArray2[0][0]=1;
myArray2[0][1]=2;
//…
myArray2[1][2]=84;

– Dùng 2 vòng for để duyệt mảng 2 chiều
Vd: mảng 2 chiều có 3 dòng 3 cột

for(int i=0;i<3;i++)
{
      for(int j=0;j<3;j++)
      {
         chuoi+= myArray2[i][j] + "";
      }
      chuoi+= "\n";
}

and2

==Thao tác với mảng số nguyên==

Kết quả đạt được ở phần này như sau:
– Khi nhấn nút “Tạo dãy ngẫu nhiên”, mảng 10 phần tử được tạo ra và đưa vào EditText.
– Khi nhấn nút “Xuất xuôi/Xuất ngược”, mảng xuất theo yêu cầu.
– Nhấn nút “Tìm min max”, xuất ra giá trị nhỏ nhất và lớn nhất của mảng. Hiển thị kết quả trên TextView.
– Nhấn nút “Dãy tăng dần”, mảng sẽ được sắp xếp theo thứ tự tăng dần.
– Ngoài ra có các chức năng khác tự thực hiện như: Tổng 3 phần tử đầu, Các số lẻ tăng dần sau đó là các số chẵn tăng dần.
– Tạo thêm nhiều button (Widget) vượt khỏi màn hình thiết bị để xem kết quả sử dụng ScrollView (Cuộn menu).

Các bước thực hiện

  1. Tạo project mới với tên MangSoNguyen. (Lưu ý chọn Empty Activity (Blank Act), chưa cần dùng template khác.
  2. Thiết kế giao diện

Mở file activity_main.xml theo đường dẫn như hình (click vào hình để xem kích thước đầy đủ). Tại đây, panel Component Tree phía bên phải ide là nơi giúp chúng ta quan sát được cấu trúc các widget được bố trí ra sao.
and3

a. Hiện kết quả ứng dụng

Nhấp vào option Text, và thực hiện các thẻ như hình. Bạn có thể thiết kế giao diện bằng kéo thả (từ Palette vào screen device, hoặc kéo thả vào Component Tree). Canh chỉnh cho phù hợp. Cách thực hiện ở bước này như ở bài hướng dẫn “Làm quen Android Studio” kỳ trước. Các thuộc tính như id, layout_width, … bạn hãy tự custom tùy ý để quen tay hơn.

and4

b.

Tại Containers, kéo vào Component Tree, sau các thành phần trước đó 1 ScrollView, sau đó tùy chỉnh kích thước chiều ngang của scrollView bằng việc click trực tiếp vào screen device hoăc bằng panel Properties.

Kéo tiếp vào 1 LinearLayout(Vertical), nằm vị trí đa cấp của scrollView
and5

c. Kéo vào sau LinearLayout(vertical) vừa tạo, 10 button.
and6

Chạy thử ứng dụng, nếu chiều cao của 10 button không vượt khỏi màn hình thiết bị thì sẽ không thấy được tác động của scrollView, khi đó ta chọn từng button và trong panel Properties, chỉnh lại layout:height bằng 60dp (hoặc nhiều hơn). Để nút rộng đầy màn hình, ta chỉnh thêm thuộc tính layout:width bằng match_parent.
and7

 

d. Sửa thuộc tính Text của các  button lần lượt là: “Tạo dãy ngẫu nhiên”, “Xuất xuôi”, “Xuất ngược”, “Tìm min max”, “Dãy tăng dần”
and8
e. Chạy lại ứng dụng để test thử scrollView 😀
Screenshot_2016-09-13-18-46-08       Screenshot_2016-09-13-18-45-58

Build & Show ^^

   3. Mở file MainActivity.java trong thư mục src.

and9
Trong Class khai báo các biến:

 
EditText et_day;
TextView tv_kq;
Button taoday,xuatxuoi,xuatnguoc,minmax;
int myArray[] =new int[10];
  1. Trong hàm onCreate ánh xạ các widget như sau:
et_day=(EditText)findViewById(R.id.editText);
tv_kq=(TextView)findViewById(R.id.textView2); //textView1 ta sửa thuộc tính Text trong giao diện là "Dãy ngẫu nhiên"
taoday=(Button)findViewById(R.id.button);
xuatxuoi=(Button)findViewById(R.id.button2);
xuatnguoc=(Button)findViewById(R.id.button3);
minmax=(Button)findViewById(R.id.button4);
  1. Sau hàm onCreate, ta tạo một hàm chức năng duyệt mảng và đổ vào EditText.
public void ArraytoEditText()
{
    String chuoi="";
    for(int i=0;i<10; i++)
    {
        chuoi +=myArray[i]+ " ";
    }
    et_day.setText(chuoi);
}
  1. Viết sự kiện onClick cho nút tạo dạy ngẫu nhiên (button 1) trong hàm onCreate()
taoday.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v)
    {
        Random rd=new Random();
        String chuoi="";
        for(int i=0;i<10;i++) { //mang[i]=rd.nextInt(10); //từ 0 đến 9 myArray[i]=rd.nextInt(50-10+1)+10; //từ 10->50   // (b-a+1)+a
        }
        ArraytoEditText();
    }
});
  1. Viết sự kiện onClick cho nút xuatxuoi (gọi hàm ArraytoEditText(); )
xuatxuoi.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v)
    {
        ArraytoEditText();
    }
});
  1. Viết sự kiện onClick cho nút xuatnguoc
xuatnguoc.setOnClickListener(new View.OnClickListener()
 {
     public void onClick(View v)
     {
         String chuoi="";
         for(int i=9;i>=0;i--)
         {
             chuoi+= myArray[i]+ " ";
         }
         et_day.setText(chuoi);
     }
 });
  1. Viết sự kiện onClick cho nút minmax (Cho min, max đều là phần tử đầu của mảng, sau đó dùng for duyệt, phần tử nào nhỏ hơn min thì cập nhật min, tương tự cho max)
minmax.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View v)
    {
       int min=myArray[0];
       int max=myArray[0];
       for(int i=0;i<10;i++)
       {
         if(myArray[i]<min) min=myArray[i]; if(myArray[i]>max) max=myArray[i];
       }
       tv_kq.setText("Min: "+min + " max: "+max);
    }
});

10. Những button còn lại bạn có thể tự rèn luyện nha. Bây giờ chạy ứng dụng và xem thành quả

Code đầy đủ:
File xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.wosea.mangsonguyen.MainActivity">

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Dãy ngẫu nhiên" android:id="@+id/textView1" />

    <EditText android:layout_width="353dp" android:layout_height="wrap_content" android:id="@+id/editText" />

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Large Text" android:id="@+id/textView2" />

    <ScrollView android:layout_width="356dp" android:layout_height="wrap_content" android:id="@+id/scrollView" >

        <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">

            <Button android:layout_width="match_parent" android:layout_height="60dp" android:text="Tạo dãy ngẫu nhiên" android:id="@+id/button" />

            <Button android:layout_width="match_parent" android:layout_height="60dp" android:text="Xuất xuôi" android:id="@+id/button2" />

            <Button android:layout_width="match_parent" android:layout_height="60dp" android:text="Xuất ngược" android:id="@+id/button3" />

            <Button android:layout_width="match_parent" android:layout_height="60dp" android:text="Tìm min max" android:id="@+id/button4" />

            <Button android:layout_width="match_parent" android:layout_height="60dp" android:text="Dãy tăng dần" android:id="@+id/button5" />

            <Button android:layout_width="match_parent" android:layout_height="60dp" android:text="New Button 6" android:id="@+id/button6" />

            <Button android:layout_width="match_parent" android:layout_height="60dp" android:text="New Button 7" android:id="@+id/button7" />

            <Button android:layout_width="wrap_content" android:layout_height="60dp" android:text="New Button 8" android:id="@+id/button8" />

            <Button android:layout_width="wrap_content" android:layout_height="60dp" android:text="New Button 9" android:id="@+id/button9" />

            <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button 10" android:id="@+id/button10" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

File java

package com.wosea.mangsonguyen;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

    EditText et_day;
    TextView tv_kq;
    Button taoday,xuatxuoi,xuatnguoc,minmax;
    int myArray[] =new int[10];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_day=(EditText)findViewById(R.id.editText);
        tv_kq=(TextView)findViewById(R.id.textView2); //textView1 ta sửa thuộc tính Text trong giao diện là "Dãy ngẫu nhiên"
        taoday=(Button)findViewById(R.id.button);
        xuatxuoi=(Button)findViewById(R.id.button2);
        xuatnguoc=(Button)findViewById(R.id.button3);
        minmax=(Button)findViewById(R.id.button4);

        taoday.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                Random rd=new Random();
                String chuoi="";
                for(int i=0;i<10;i++) { //mang[i]=rd.nextInt(10); //từ 0 đến 9 myArray[i]=rd.nextInt(50-10+1)+10; //từ 10->50   // (b-a+1)+a
                }
                ArraytoEditText();
            }

        });

        xuatxuoi.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                ArraytoEditText();
            }
        });


        xuatnguoc.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                String chuoi="";
                for(int i=9;i>=0;i--)
                {
                    chuoi+= myArray[i]+ " ";
                }
                et_day.setText(chuoi);
            }
        });

        minmax.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                int min=myArray[0];
                int max=myArray[0];
                for(int i=0;i<10;i++)
                {
                    if(myArray[i]<min) min=myArray[i]; if(myArray[i]>max) max=myArray[i];
                }
                tv_kq.setText("Min: "+min + " max: "+max);
            }
        });
    }

    public void ArraytoEditText()
    {
        String chuoi="";
        for(int i=0;i<10; i++)
        {
            chuoi +=myArray[i]+ " ";
        }
        et_day.setText(chuoi);
    }
}

Screenshot_2016-09-13-21-47-05

 

==Rút bài tây 52 lá ==

Ở phần này, chúng ta sẽ cùng hoàn thành một ứng dụng đơn giản, rút 3 lá bài ngẫu nhiên từ 52 lá bài. Phát triển hơn, chúng ta sẽ đưa ra kết quả tổng số nút của 3 lá bài,…

  1. Tạo mới project
  2. Bạn tìm trên mạng hoặc tự tạo hình các lá bài tương tự, copy vào thư mục drawable. Sẵn mình nói luôn, bạn nhìn thư mục mipmap, thấy ic_launcher.png với các thông số (hdpi, mdpi,…). Đây là thư mục chứa launcher của ứng dụng, bạn có thể tùy ý thay đổi, còn các thông số bạn nên search tìm hiểu thêm trên mạng, rất cần thiết cho thiết kế ứng dụng sau này.

and10

 

     3. Tại thư mục values, mở file strings.xml và thực hiện như hình (click vào hình để xem rõ hơn). Với cách này, bạn đã biết thêm được cách thay đổi thuộc tính text của button, textview…

and11
4. Thiết kế giao diện

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.wosea.rutbai.MainActivity">

    <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />

    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" />
    <Button android:id="@+id/rutbai" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rutbai" />

    <ImageView android:id="@+id/ivlabai1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/b2fv" />

    <ImageView android:id="@+id/ivlabai2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/b2fv" />

    <ImageView android:id="@+id/ivlabai3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/b2fv" />

    <TextView android:id="@+id/txtthongbao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/txtthongbao" android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

5. Cài đặt chương trình
*Khi khai báo resource trong file java (R.drawable.picture-name) thì bên lề trái hiển thị hình ảnh tương ứng, điều này không có khi sử dụng Eclipse ^^

package com.wosea.rutbai;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.Random;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {

    Button rutbai;
    ImageView labai1;
    ImageView labai2;
    ImageView labai3;
    TextView thongbao;

    int sonut=0;//de xet xem duoc may nut
    int darut=0;//chi cho rut 3 la
    boolean batay=true;//de xet truong hop 3 tay
    String chuoithongbao="";
    ArrayList<String> cacladarut=new ArrayList<String>();//chua ten la da rut;

    //de de lam nen cho mang[][0] khong co y nghia (chi dung mang[][1]tro di
    int manghinhbai[][]={
            {R.drawable.b2fv,
                    R.drawable.c1,R.drawable.c2,R.drawable.c3,R.drawable.c4,R.drawable.c5,
                    R.drawable.c6,R.drawable.c7,R.drawable.c8,R.drawable.c9,R.drawable.c10,
                    R.drawable.cj,R.drawable.cq,R.drawable.ck},

            {R.drawable.b2fv,
                    R.drawable.d1,R.drawable.d2,R.drawable.d3,R.drawable.d4,R.drawable.d5,
                    R.drawable.d6,R.drawable.d7,R.drawable.d8,R.drawable.d9,R.drawable.d10,
                    R.drawable.dj,R.drawable.dq,R.drawable.dk},

            {R.drawable.b2fv,
                    R.drawable.h1,R.drawable.h2,R.drawable.h3,R.drawable.h4,R.drawable.h5,
                    R.drawable.h6,R.drawable.h7,R.drawable.h8,R.drawable.h9,R.drawable.h10,
                    R.drawable.hj,R.drawable.hq,R.drawable.hk},

            {R.drawable.b2fv,
                    R.drawable.s1,R.drawable.s2,R.drawable.s3,R.drawable.s4,R.drawable.s5,
                    R.drawable.s6,R.drawable.s7,R.drawable.s8,R.drawable.s9,R.drawable.s10,
                    R.drawable.sj,R.drawable.sq,R.drawable.sk}
    };
    String mangtenbai[][]={
            {"rong",
                    "ach chuon","hai chuon","ba chuon","bon chuon","nam chuon",
                    "sau chuon","bay chuon","tam chuon","chin chuon","muoi chuon",
                    "boi chuon","dam chuon","gia chuon"},

            {"rong",
                    "ach ro","hai ro","ba ro","bon ro","nam ro",
                    "sau ro","bay ro","tam ro","chin ro","muoi ro",
                    "boi ro","dam ro","gia ro"},

            {"rong",
                    "ach co","hai co","ba co","bon co","nam co",
                    "sau co","bay co","tam co","chin co","muoi co",
                    "boi co","dam co","gia co"},

            {"rong",
                    "ach bich","hai bich","ba bich","bon bich","nam bich",
                    "sau bich","bay bich","tam bich","chin bich","muoi bich",
                    "boi bich","dam bich","gia bich"}
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rutbai=(Button)findViewById(R.id.rutbai);
        labai1=(ImageView)findViewById(R.id.ivlabai1);
        labai2=(ImageView)findViewById(R.id.ivlabai2);
        labai3=(ImageView)findViewById(R.id.ivlabai3);
        thongbao=(TextView)findViewById(R.id.txtthongbao);


        rutbai.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                // TODO Auto-generated method stub


                if(darut==0)//lan dau hoac rut lai
                {
                    darut=0;
                    sonut=0;
                    batay=true;
                    chuoithongbao="";
                    labai1.setImageResource(R.drawable.b2fv);
                    labai2.setImageResource(R.drawable.b2fv);
                    labai3.setImageResource(R.drawable.b2fv);
                    cacladarut.clear();
                }
                darut++;   //dem so lan rut

                //tao ngau nhien
                Random rd=new Random();
                int x,y;
                //tao ngau nhien bao vao ArrayList de xet xem co bi trung khong
                while(true)
                {
                    x=rd.nextInt(4);//0->3 (b-a+1)+a;
                    y=rd.nextInt(13)+1;//1->13
                    if(cacladarut.contains(mangtenbai[x][y])==false)
                    {
                        cacladarut.add(mangtenbai[x][y]);
                        break;
                    }

                }
                //chi can y<11 lap tuc khong con la batay nua
                if(y<11)
                    batay=false;


                if(darut==1)
                {
                    sonut+=(y<10)?y:0;
                    labai1.setImageResource(manghinhbai[x][y]);
                }
                else if(darut==2)
                {
                    sonut+=(y<10)?y:0;
                    labai2.setImageResource(manghinhbai[x][y]);
                }
                else if(darut==3)
                {

                    sonut+=(y<10)?y:0;
                    int kq=sonut%10;
                    darut=0;

                    labai3.setImageResource(manghinhbai[x][y]);
                    chuoithongbao+=" so nut la "+ kq;
                    //rutbai.setEnabled(false);
                }
                thongbao.setText("Cac la da rut"+cacladarut.toString()
                        +chuoithongbao +"ba tay"+batay);
            }
        });
    }
}

Kết quả:

Screenshot_2016-09-13-23-10-36

 

Chúng ta kết thúc tại đây, bạn hãy tự khám phá thêm những thành phần giao diện và các thư mục trong một project Android. OK, chúc bạn học tốt!


Cám ơn bạn đã theo dõi blog.
Nhiều ngày tốt lành!

Advertisements

One thought on “Thực hành với mảng (Array)

  1. Pingback: Lập trình Android (Cơ bản) | Sâu non tìm lá

Cho mình biết cảm nhận của bạn nhé

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s