2014年1月19日 星期日

[Java]ArrayList 集合物件化

前文回顧:
Read file & ArrayList & String型態陣列轉換

這篇之前寫的網誌,有提到在處理一個檔案的時候應該要怎麼寫會比較好
經過一學期的磨練,發現到自己之前寫的這篇,寫法上較沒有彈性
也沒有真正的落實 Java 物件化的觀念
以及沒有展示出物件化強大的地方 和 ArrayList的好用之處

想想,假設今天我們要讀近來的一個檔案
內文有 <學生姓名  數學成績  英文成績>
顯然的,學生姓名我們會希望用String來儲存
數學成績英文成績會想要用 double或int來儲存,因為可能會對這些成績做加總運算
或是由高到低的排序運算
這時候如果用之前的方法,必須要再多寫一個for迴圈轉 型態
並且在處理上會沒有較多的彈性空間

所以以下附上我的Source code
並且說明ArrayList物件化的概念



<Step>
<開發環境:Eclipse>
<程式架構>


在這邊我新增兩個java檔
一個是Main -->寫主要執行的地方
一個是Member -->顧名思義這邊是讓我放Class的成員宣告

另外我有寫檔的動作
自己的測試檔 test.txt範例如下

Alex 97.4 80.5
Bob 56.7 99.0
Tony 70.5 88.6
Cindy 83.5 69.8

<Member.java>

public class Member {
/*
因為讀進檔案的格式是<學生姓名 數學成績 英文成績>
所以分別對應到的型態是 <String double double>
宣告private的原因是希望不要讓別人隨便改到此值
*/
   private String m_name; //姓名
   private double m_math; //數學成績
   private double m_english; //英文成績
 
/*
因為型態已經是private,如果要改值的話,就宣告一個 set Method來改我們想要的值
取值的話再用get Method來取得
*/  
   public void setName(String name){
    m_name = name;
   }
   public void setMath(double math){
    m_math = math;
   }
   public void setEng(double eng){
    m_english = eng;
   }
   public String getName(){
    return m_name; 
   }
   public double getMath(){
    return m_math;
   }
   public double getEng(){
    return m_english;
   }
}

<Main.java>

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;


public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new FileReader("test.txt")); //將讀檔從兩行寫成一行,更清楚簡潔
        String line = null;
        ArrayList<Member> myList = new ArrayList<Member>(); 
        //在ArrayList中,<> 看成是一個容器,今天這個容器裡面裝的是 Member這個Class
        //所以在這個myList所擁有的性質就會有 Member這個Class裡面的成員,就可以使用我們宣告的Method
        while((line=br.readLine())!=null){
            Member m = new Member();  //每一次都要重新宣告新的物件
            m.setName(line.split("\\s")[0]); //以空白切開,將切開後的第一個丟到setName
            m.setMath(Double.parseDouble(line.split("\\s")[1])); //以空白切開,將切開後的第二個丟到setMath
            m.setEng(Double.parseDouble(line.split("\\s")[2])); //以空白切開,將切開後的第三個丟到setEng
            myList.add(m);
        //當while迴圈值型結束,也就將整個檔案內容讀完,一一的放到myList這個動態陣列裡面了
        }

        System.out.println("Size:"+myList.size());
        System.out.println(myList.get(3).getName());
        System.out.println(myList.get(3).getMath());
        System.out.println(myList.get(3).getEng());
    }
}

接著show出 output結果

Size:4
Cindy
83.5
69.8

跟之前的版本相比
現在這篇簡潔了許多
彈性空間也增加了不少

例如: 如果老師今天想要加一位同學分數
我們可以在Member這個Class裡面新增一個 addgrade( ) Method
或是想要對學生成績做大到小的排序
都可以直接寫在Member.java裡面
之後會再一一介紹 :)

Related Articles

0 意見:

張貼留言

技術提供:Blogger.