Đọc dữ liệu từ file text trong Java

Trước khi học bài này bạn nên đọc lại bài:

Để hiểu rõ về cách Java đọc dữ liệu một chút vì nó rất quan trọng nếu bạn không hiểu rõ cái này thì sẽ mãi không làm chủ được Java đâu 🙂

Tổng quan

doc-du-lieu-yeulaptrinh.pw

Các luồng và class trong I/O file text

Nhắc lại nguyên lý đọc dữ liệu trong Java một chút: các thiết bị vào ra (bàn phím, màn hình…) qua luồng rồi ta mới nhận được thông tin.

 luong-trong-doc-file-yeulaptrinh.pwSử dụng BufferedReader BufferedWriter

Đọc, ghi file với BufferedReader và BufferedWriter là cách đọc nhanh nhất trong Java, ngoài ra nó còn có nhiều tính năng có sẵn kèm theo như: đọc cả dòng, encoding… Có nhiều cách đọc, ghi file nhưng mình khuyên các bạn nên dùng cách này dù nó có dài hơn một chút (code bên dưới).

import java.io.*;
import java.util.*;

public class ReadTest2
{
	static long total = 0;

	private static void ReadLines() {
		try {
			String s = "";
			BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
			while (stdin.ready()) {
				s = stdin.readLine();
				for (int i=0; i

Sử dụng FileReader và FileWriter

Thằng này thì không hỗ trợ đọc từng dòng, mã hóa và nó làm việc với bảng mã mặc định của hệ thống nên nó không phải là cách tốt để đọc và ghi file.

static void copyFile(FileReader inputFile, FileWriter outputFile) {
try{
  // Read the first character.
  int nextChar = inputFile.read();
  // Have we reached the end of file?
  while(nextChar != -1) {
    outputFile.write(nextChar);
    // Read the next character.
    nextChar = inputFile.read();
  }
  outputFile.flush();
}
catch(IOException e) {  System.out.println("Unable to copy file");
}
}

PALINY – spoj

Đề bài:

Thuật toán:

Chặt nhị phần + Hash

Code:

{$H+}
uses math;
const
  fi='';//paliny.inp';
  fo='';//paliny.out';
  maxn=50003;
  pp=307;
  base=trunc(1e9)+7;
var
  i,j,n,d,c,g,top,ans : longint;
  ha,hb,pow : array[0..maxn] of int64;
  a : array[1..maxn] of longint;
  s : string;
function gethash1(l,r : longint) : int64;
  begin
    gethash1 := (ha[r] - ha[l-1] * pow[r-l+1] + base * base) mod base;
  end;
function gethash2(l,r : longint) : int64;
  begin
    gethash2 := (hb[r] - hb[l+1] * pow[l-r+1] + base * base) mod base;
  end;
function ok ( le : longint) : boolean;
  var i,j : longint;
  begin
    for i := 1 to n - le + 1 do
      if gethash1(i,i+le-1) = gethash2(i+le-1,i) then exit(true);
    exit(false);
  end;
procedure process;
  begin
  d := 1 ;
  c := top ;
  g := (d+c) div 2;
  while (G<>d) and (g<>C) do
    begin
      if ok (a[g]) then d := g else c := g;
      g := (d+c) div 2;
    end;
  for g := c downto d do
    if ok (a[g]) then
      begin
        ans := max(ans,a[g]);
        exit;
      end;
  end;
procedure push(x : longint);
  begin
    inc(top);
    a[top] := x;
  end;
begin
  assign(input,fi);reset(input);
  assign(output,fo);rewrite(output);
  readln(n);
  readln(s);
  pow[0] := 1;
  for i := 1 to n do pow[i] := pow[i-1] * pp mod base;
  for i := 1 to n do ha[i] := ( ha[i-1] * pp + ord(s[i]) ) mod base;
  for i := n downto 1 do hb[i] := ( hb[i+1] * pp + ord(s[i]) ) mod base;
  top := 0;
  for i := 1 to n do
    if i mod 2 = 0 then push(i);
  process;
  top := 0;
  for i := 1 to n do
    if i mod 2 = 1 then push(i);
  process;
  writeln(ans);
  close(input);close(output);
end.

Đặt tên biến trong Java

Nhiều bạn học ngôn ngữ lập trình nhưng vẫn còn đặt tên biến chưa đúng, sai so với quy ước chung. Hôm nay mình sẽ chia sẻ với các bạn cách đặt tên trong Java nói riêng và trong lập trình nói chung một cách đúng, chuẩn nhất.

Khái niệm định danh là gì?

Định danh là một xâu ký tự thể hiện tên các biến, các phương thức, các lớp và nhãn

Định danh là tên của biến ví dụ như: i, j, a, b, s, ans, value…

Định danh là tên của phương thức ví dụ như: getName(), setTime(), goHome()…

Quy định về định danh:wrong-java-yeulaptrinh-pw

  • Các ký tự có thể là chữ số, chữ cái, ‘$’ hoặc ‘_’.
  • Tên không được phép:
    • Bắt đầu bởi một chữ số.
    • Trùng với từ khóa.
  • Phân biệt chữ hoa chữ thường.http://yeulaptrinh.de/wp-content/uploads/2017/01/correct-java-yeulaptrinh.pw_-1-1.png
    • Yourname, yourname, YourName và yourName là 4 định danh khác nhau.

 

Quy ước với định danh (naming convention):

  • Bắt đầu bằng chữ cái.
  • Gói (package): tất cả sử dụng chữ thường.
    • theexample
  • Lớp (Class): viết hoa chữ cái đầu tiên trong các từ ghép lại.
    • TheExample
  • Phương thức/thuộc tính (method/field): Bắt đầu bằng chữ thường, viết hoa chữ cái đầu tiên trong các từ còn lại.
    • theExample
  • Hằng (constants): Tất cả viết hoa.
    • THE_EXAMPLE

 

Những từ không được đặt tên cho biến, hàm…

  • Literals (từ đã được định nghĩa):
    null, true, false.
  • Từ khóa (keyword)
    abstract assert boolean break byte case 
    catch char class continue default do double 
    else extends final finally float for if 
    implements import instanceof int interface 
    long native new package private protected 
    public return short static strictfp super 
    switch synchronized this throw throws 
    transient try void volatile while
  • Từ dành riêng (reserved for future use)
    byvalue cast const future generic goto inner
    operator outer rest var volatile