การอ่านไฟล์แบบ text ด้วยคลาส Scanner

เราสามารถเขียนโปรแกรมอ่านไฟล์แบบ text(ไฟล์ที่เปิดอ่านด้วย text editor ได้) ด้วยคลาส Scanner โดยระบุตำแหน่งของไฟล์ที่ต้องการอ่าน เพื่อสร้างอินแสตนซ์ของคลาส Scanner และใช้อินสแตนซ์ดังกล่าว ในการอ่านข้อมูลขึ้นมาแบบลำดับ จากตำแหน่งแรกของข้อมูลบนไฟล์ ไปยังข้อมูลถัดไปด้วยการใช้เมธอด next(?)  เมื่ออ่านแล้วจะมีการย้ายตำแหน่งการอ่านไปยังข้อมูลตัวถัดไป การอ่านข้อมูลด้วยเมธอด next(?) มีหลายแบบขึ้นอยู่กับชนิดข้อมูลที่ต้องการอ่านขึ้นมา เช่น

  • next( )   อ่านข้อมูลชนิด String
  • nextLine( )  อ่านข้อมูลเป็นชนิด String  ทั้งบรรทัด
  • nextInt( ) อ่านข้อมูลชนิด integer
  • nextDouble( ) อ่านข้อมูลชนิด double
  • nextBoolean( ) อ่านข้อมูลชนิด boolean
  • อื่น ๆ ( อ่านเพิ่มเติมใน Java API  )

ตัวอย่างการอ่านไฟล์ input.txt มีข้อมูลดังนี้

Greeter 
123   22
22.25  c d
false
I love a loney way.

รูปแบบโค๊ดในการอ่านจะเป็นดังนี้

Scanner sc = new Scanner(new File("input.txt"));
sc.next(); //Greeter
sc.nextInt();//123
sc.nextInt();//22
sc.nextDouble();//22.25
sc.nextLine();//"c d"
sc.nextBoolean();//false
sc.nextChar();//'I'
sc.nextLine();//"love a loney way."

นอกจากเมธอด next(?) แล้วยังมีเมธอดที่ใช้ควบคุมการอ่านข้อมูลของ Scanner คือ hasNext(?) ซึ่งเราสามารถนำมาประยุกต์ใช้กับข้อมูลที่มีลักษณะของการจัดเก็บที่มีรูปแบบชัดเจน โดย hasNext(?) มีหลายตัวเช่น hasNext() hasNextLine( ) hasNextInt() เป็นต้น ซึ่งขึ้นอยู่กับรูปแบบการควบคุมที่เราต้องการใช้งาน

ตัวอย่างไฟล์ student.dat ที่มีข้อมูลดังนี้

5411200260  Peter Width  3.44
5411200261  Charnwidj Pholcheewin  2.59
5411200262  Supatchai  Aimtrakool  1.04
5411200263  Raksana  Watjomjai  3.88
5411200264  Komin  Sreetanan  3.25
...

ต่อไปนี้ผมจะแสดงโค๊ดโปรแกรมสำหรับการอ่านไฟล์ student.dat เพื่อนำเก็บไว้ใน collection ชนิด ArrayList ของ Student จากตัวอย่างในบทความที่แล้ว(ตัวอย่างการเรียงวัตถุโดยใช้ Collection.sort ในจาวา)ครับ

ArrayList<Student> students=new ArrayList<Student>();
Scanner sc = new Scanner(new File("student.dat"));
while(sc.hasNextLine()){ //ตรวจสอบว่าบรรทัดถัดไปมีข้อมูลอยู่หรือไม่
  String id= sc.next();
  String name= sc.next()+" "+sc.next(); //อ่านชื่อและนามสกุลทีละตัว
  double gpa= sc.nextDouble();
  Student std=new Student(id,name,gpa);
  students.add(std);
}

คนที่สนใจแนะนำอ่านบทความนี้ต่อได้เลยครับ(ผมเคยเขียนบทความนี้ไว้ประมาณเกือบ 1 ปีที่แล้ว)

กรณีศึกษา เขียนโปรแกรม fortune ด้วย java

ผมขอจบเรื่องการอ่านไฟล์ขอ้มูลแบบ text ด้วยคลาส Scanner ไว้เพียงเท่านี้ ขอบคุณที่อ่านจนจบครับ

ตัวอย่างการเรียงวัตถุโดยใช้ Collection.sort ในจาวา

ในภาษาจาวา เมธอด Collection.sort มีโอเวอร์โหลด  2 ตัวคือ  Collection.sort( list) และ Collection.sort(list, comparator) ซึ่งช่วยให้เราสามารถลำดับวัตถุที่อยู่ใน list  อย่างง่ายได้ โดยลำดับจะเรียงตามธรรมชาติของชนิดข้อมูลที่นำมาเปรียบเทียบ จากน้อยไปหามาก อ่านเพิ่มเติม(English)

ต่อไปนี้ผมจะยกตัวอย่างการเรียงลำดับคลาส Student ที่ได้กล่าวถึงในบทความที่แล้ว(ตัวอย่างการใช้ JTable บน Netbeans IDE) โดยปรับปรุงคลาส Student ด้วยการอิมพลีเมนต์อินเตอร์เฟส Comparable<T>   โดยจะนำ gpa  ของนักเรียนมาใช้ในการเรียงลำดับครับ

//ไฟล์ Student.java

public class Student implements Comparable<Student>{

    private String id;
    private String name;
    private double gpa;

    public Student(String id, String name,double gpa ) {
        this.id = id;
        this.name = name;
        this.gpa = gpa;
    }

    public double getGpa() {
        return gpa;
    }

    public void setGpa(double gpa) {
        this.gpa = gpa;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Student o) {
        return ((Double)gpa).compareTo(o.getGpa());
    }

}

//ไฟล์ StudentSort.java

public class SortStudent {

    public static void main(String[] args){

        List<Student> students=new ArrayList<Student>();
        System.out.println("-----Before sort----");
        students.add(new Student("S003","Nattapong",3.25));
        students.add(new Student("S001","Pumin",2.50));
        students.add(new Student("S002","Jingjai",3.00));
        students.add(new Student("S005","Boonhome",1.75));
        students.add(new Student("S004","Kamron",4.00));
        printList(students);
        Collections.sort(students);
        System.out.println("----After sort----");
        printList(students);
    }

    private static void printList(List<Student> students) {
        System.out.printf("%-5s %-10s %-5s\n","#ID","#Name","#GPA");
        for(Student s: students){
            System.out.printf("%-5s %-10s %-5.2f\n"
                 , s.getId(), s.getName(), s.getGpa());
        }
    }
}

ผลการรันคลาส SortStudent เป็นดังนี้
—–Before sort—-
#ID #Name #GPA
S003 Nattapong 3.25
S001 Pumin 2.50
S002 Jingjai 3.00
S005 Boonhome 1.75
S004 Kamron 4.00
—-After sort—-
#ID #Name #GPA
S005 Boonhome 1.75
S001 Pumin 2.50
S002 Jingjai 3.00
S003 Nattapong 3.25
S004 Kamron 4.00

จากนั้นผมเปลี่ยนเมธอด compareTo ในคลาส Student ใหม่เพื่อลำดับตาม id ดังนี้

public int compareTo(Student o) {
        return id.compareTo(o.getId());
}

ผลการรันใหม่เป็นดังนี้ครับ
—–Before sort—-
#ID #Name #GPA
S003 Nattapong 3.25
S001 Pumin 2.50
S002 Jingjai 3.00
S005 Boonhome 1.75
S004 Kamron 4.00
—-After sort—-
#ID #Name #GPA
S001 Pumin 2.50
S002 Jingjai 3.00
S003 Nattapong 3.25
S004 Kamron 4.00
S005 Boonhome 1.75

ครับสำหรับบทความเรียงลำดับวัตถุด้วย Collection.sort ขอจบไว้เพียงแค่นี้ ไว้พบกันใหม่กับบทความต่อไปนะครับ : )

ตัวอย่างการใช้งาน JTable บน Netbeans

ตัวอย่างต่อไปนี้ผมจะใช้ JTable เพื่อแสดงข้อมูลของ Student ซึ่งในที่นี้ผมจะใช้ คลาส Student เพื่อใช้เก็บข้อมูลของออปเจคต์แต่ละตัว โดยคลาสนี้จะมีแอทริบิวต์อยู่ด้วยกัน 3 ตัวคือ id  name และ gpa ดังโค๊ดต่อไปนี้

// Student.java

public class Student {

    private String id;
    private String name;
    private double gpa;

    public Student(String id, String name,double gpa ) {
        this.id = id;
        this.name = name;
        this.gpa = gpa;
    }

    public double getGpa() {
        return gpa;
    }

    public void setGpa(double gpa) {
        this.gpa = gpa;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

ขั้นตอนต่อไปคือการสร้างคลาส model ให้กับ JTable เพื่อใช้ในการแสดงผล ในที่นี้ผมใช้
ArrayList ชนิด Student เพื่อเก็บข้อมูลของนักเรียนทุกคน ดังตัวอย่างโค๊ดต่อไปนี้

//StudentTableModel.java

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class StudentTableModel extends AbstractTableModel {

    ArrayList<Student> students ;
    String[] header={"ID","Name","GPA"};

    public StudentTableModel(){
        students = new ArrayList<Student>();
        initDatas();
    }

    //กำหนดค่าเริ่มต้นให้กับข้อมูล
    private void initDatas(){
       students.add(new Student("s001", "Suchart",3.5 ));
       students.add(new Student("s002", "Padping" ,3.4));
       students.add(new Student("s003", "Lindum" ,1.25));
    }

    @Override
    public String getColumnName(int columnId){
        //return ชื่อของแต่ละ column ที่ต้องการแสดงใน table
        return header[columnId] ;
    }

    @Override
    public int getRowCount() {
        //return จำนวนแถวข้อมูลทั้งหมด
        return students.size();
    }

    @Override
    public int getColumnCount() {
        //return จำนวนของ column
        return header.length ;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if( students.isEmpty() ){
            return null;
        }else{
            Student s = students.get(rowIndex);
            //if you have more field should specify more case here
            switch(columnIndex){
                case 0 : // id first
                    return s.getId() ;
                case 1 :
                    return s.getName();
                case 2 :
                    return s.getGpa() ;

                default : return null;
            }
        }
    }

}

ต่อไปผมแสดงวิธีการสร้าง JTable ด้วย Netbeans IDE และการกำหนดค่าให้กับ table โดยใช้ model จากคลาสข้างต้นครับ

ก่อนอื่นสร้างไฟล์ชนิด JFrame Form ด้วย Netbeans ขึ้นมาและเพิ่มคอมโพเนนต์ JTable ให้ได้ดังรูป

จากนั้น คลิ๊กขวาที่ table เลือกเมนู Customize Code (เมนูอันที่ 2 จากด้านล่าง) จะปรากฏไดอะล็อกให้แก้ไขโค๊ดในส่วน Initialization Code ส่วนที่ 2 ให้เลือกเป็น custom property จากนั้นแก้ไขโค๊ดให้เป็นดังรูป จากนั้นกดปุ่ม OK

เมื่อเรารันไฟล์ดังกล่าวจะปรากฏผลลัพธ์ดังรูป

เท่านี้เราก็สามารถปรับแต่งให้ JTable ในโปรแกรมของเรามีความยืดหยุ่นได้   ยกตัวอย่างเช่นเราสามารถแก้ไขโค๊ดให้โหลดข้อมูลจากไฟล์หรือดาต้าเบสได้จากคลาส model ครับ

หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่สนใจในการเขียนโปรแกรมภาษาจาวานะครับ แล้วพบกันใหม่ในบทความหน้าครับ : )

เมนู Printing หายไปใน Ubuntu

ผมต้องการติดตั้ง printer ให้กับ ubuntu ที่ใชัอยู่ ปรากฏว่าพอไปดูที่เมนู System->Administration ไม่มีเมนู  printing  เหมือนเดิม จึงแปลกใจ ทำยังไงจึงจะติดตั้ง printer ได้ จึงเข้าไปค้นหาใน google  จึงพบว่ามีวิธีการเรียก configuration ของ printer ได้โดยใช้คำสั่ง

system-config-printer-gnome

ตอนนี้ก็ถือว่ากล้อมแกล้ม ไปได้สักพักล่ะนะ

การใช้ code template ของ Netbeans IDE

ใน Netbeans IDE มี code template  ช่วยให้เราสามารถทำงานได้ง่ายขึ้น ด้วยการพิมพ์ คีย์เวิร์ดสั้น ๆ จากนั้น กดปุ่ม tab มันจะแปลง คียเวิร์ดเหล่านั้นให้เป็น code template ที่กำหนดไว้ได้

วีดีโอต่อไปนี้เป็นตัวอย่างการใช้ code template ซึ่งเป็นค่า default ของ Netbeans IDE (ตัวที่ผมใช้อยู่เป็นเวอร์ชั่น 7.0.1) ได้แก่ psvm+tab   if+tab   ife+tab  และ for+tab ตามลำดับครับ