การเรียงข้อมูลใน Java 8

การเรียงข้อมูลใน Java 8 เขียนสั้นลงและอ่านง่ายขึัน

ตัวอย่างถัดไปแสดงการเรียงข้อมูลพนักงานโดยใช้คุณสมบัติ lambda expression

โดยในส่วนแรกใช้ stream และส่วนถัดไปใช้ Collections เพื่อนเก่า

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class Test {

  public static void main(String[] args) {
    List<Person> staffs = new ArrayList<>();
    staffs.add(new Person("Tom", 23));
    staffs.add(new Person("Ann", 32));
    staffs.add(new Person("Roy", 10));

    System.out.println(staffs);
    Object[] objects = staffs.stream().sorted((p1, p2) -> p1.getAge() - p2.getAge()).toArray();
    System.out.println(java.util.Arrays.toString(objects));

    System.out.println("-----------------");

    System.out.println(staffs);
    Collections.sort(staffs, (p1, p2) -> p1.getAge() - p2.getAge());
    System.out.println(staffs);
  }
}

ผลการทำงานคือ

[Person{name=Tom, age=23}, Person{name=Ann, age=32}, Person{name=Roy, age=10}]
[Person{name=Roy, age=10}, Person{name=Tom, age=23}, Person{name=Ann, age=32}]
-----------------
[Person{name=Tom, age=23}, Person{name=Ann, age=32}, Person{name=Roy, age=10}]
[Person{name=Roy, age=10}, Person{name=Tom, age=23}, Person{name=Ann, age=32}]
public class Person {
  private String name;
  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

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

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "Person{" + "name=" + name + ", age=" + age + '}';
  }
}

สอนเขียน Java

หากจะนำข้อความไปใช้ ต้องแสดงที่มา และห้ามใช้ในเชิงพาณิชย์

เขียนจาวาหาค่าผลรวมของอาร์เรย์โดยไม่ต้องวนลูป

ใช้คลาส IntStream หาค่า sum ของอาร์เรย์ a โดยไม่ต้องวนลูป (Java 8)

IntStream.of(a).sum()
import java.util.stream.IntStream;

public class Test {
  public static void main(String[] args) {
    int[] a = {3,2,3,5,7};
    int sum;
    
    // calculate the total
    sum = IntStream.of(a).sum();
    System.out.println(sum);    // 20
    
    //  filter then calculate the total
    sum = IntStream.of(a).filter(i -> i != 3).sum();
    System.out.println(sum);    // 14
    
    // sort
    IntStream.of(a).sorted().forEach(System.out::println);
    
    // map
    a = IntStream.of(a).map(e -> e+1).toArray();
    System.out.println("a = " + java.util.Arrays.toString(a));  // a = [4, 3, 4, 6, 8]

    // sum by reduce
    sum = IntStream.of(a).reduce(0, (m,n) -> m+n);
    System.out.println(sum);    // 25
  }
}

interface Collection มีเมธอด stream ซึ่งนำมาใช้หาผลรวมของบางแอททริบิวท์ได้

import java.util.ArrayList;
import java.util.Collection;

public class Test {
  public static void main(String[] args) {
    Collection<Person> staffs = new ArrayList<>();
    staffs.add(new Person("Tom", 23));
    staffs.add(new Person("Ann", 32));
    staffs.add(new Person("Roy", 10));
    
    int totalAge = staffs.stream().mapToInt(Person::getAge).sum();
    System.out.println(totalAge); // 65
  }
}

สอนเขียน Java

หากจะนำข้อความไปใช้ ต้องแสดงที่มา และห้ามใช้ในเชิงพาณิชย์

Numerical Method using Python

เพจนี้ลิงค์ไปหา source code ของ numerical method ต่างๆที่เขียนโดยใช้ภาษา Python 3 โค้ดเหล่านี้อาจจะมี bug ดังนั้นผมจะไม่รับผิดชอบต่อความเสียหายอันเกิดจากการนำโค้ดเหล่านี้ไปใช้ และถ้าพบ bug ก็ช่วยเมลบอกผมด้วยครับ (uuriter@yahoo.com)

หาราก
Bisection

แก้ระบบสมการ : วิธีตรง
Guassian Elimination
Guassian Elimination with Pivot
Guassian Elimination with Scaled Pivot

แก้ระบบสมการ : วิธีทำซ้ำ
Jacobi
Gauss-Seidel
Successive Over-Relaxation (SOR)

ประมาณค่าในช่วง
Cubic Spline

Cubic Spline Interpolation

The following Python code is implemented from a pseudo code in Burden & Faires, “Numerical Analysis” 8th edition

# author : worasait suwannik
# date   : apr 2015

def cubic_spline(n, x, y):
  h = [x[i+1]-x[i] for i in range(n)]
  al = [3*(y[i+1]-y[i])/h[i] - 3*(y[i]-y[i-1])/h[i-1] for i in range(1,n)]
  al.insert(0,0)
  
  l = [1] * (n+1)
  u = [0] * (n+1)
  z = [0] * (n+1)
  for i in range(1, n):
    l[i] = 2*(x[i+1]-x[i-1]) - h[i-1]*u[i-1]
    u[i] = h[i]/l[i]
    z[i] = (al[i] - h[i-1]*z[i-1])/l[i]
  
  b = [0] * (n+1)
  c = [0] * (n+1)
  d = [0] * (n+1)
  for i in reversed(range(n)):
    c[i] = z[i] - u[i]*c[i+1]
    b[i] = (y[i+1]-y[i])/h[i] - h[i]*(c[i+1] + 2*c[i])/3
    d[i] = (c[i+1]-c[i])/(3*h[i])
  return [y, b, c, d]
  
if __name__ == '__main__':
  import math
  a = cubic_spline(3, [i for i in range(4)], [math.e ** i for i in range(4)])
  print(a)

ทดลองรันและดูกราฟได้ที่ https://trinket.io/python/0793687aa3 เส้นสีดำคือ e^x ส่วนเส้นสีแดง เขียว น้ำเงิน เป็นการประมาณค่าในช่วง [0,1], [1,2], [2,3] ตามลำดับ

สอนเขียน Python

Numerical Method using Python

หากจะนำข้อความไปใช้ ต้องแสดงที่มา และห้ามใช้ในเชิงพาณิชย์

numpy

ดาวน์โหลด Numpy พร้อม Python interpreter โดย google numpy โหลดไฟล์ต่อไปนี้ numpy-1.9.2-win32-superpack-python3.4.exe คือลงทีเดียวได้ทั้ง interpreter และ numpy (ถ้าลงแยกคิดว่าต้องคอมไพล์ numpy ใหม่)

from numpy import *
from numpy.linalg import *

a = matrix([[2, 3], [4, 5]])
b = inv(a)
print(a*b)

ได้ผลคือ

[[ 1.  0.]
 [ 0.  1.]]