这节主要介绍了几个抽象数据类型的例子
* 几何对象
* 信息处理对象
* 字符串对象
此外这本书中用到的数据类型可以分为以下几类
- java.lang.* 包下的抽象数据类型
- java标准库中的抽象数据类型
- I/O处理类的抽象数据类型
- 面向数据类抽象数据类型(现实中的实例,通过面向对象的封装性包装)
- 集合类抽象数据类型( bag, stack, queue )
- 面向操作的抽象数据类型( 路径广度优先算法, 深度优先算法 )
- 图算法相关的抽象数据类型(无向图, 有向图)
1:几何对象
为3种常见的几何对象定义了抽象数据类型,这3中几何对象是Point2D(平面上的点), Interval1D(直线上的间隔),Interval2D(平面上的间隔,即和数轴对齐的长方形)
- Point2D的API
- Interval1D的API
- Intrval2D的API
下面是3个API的综合用例(在控制台上绘出一个长方形,计算随机分布的10000个点有多少个落在该长方形内)
import java.util.Scanner;
import edu.princeton.cs.algs4.Interval1D;
import edu.princeton.cs.algs4.Interval2D;
import edu.princeton.cs.algs4.Point2D;
public class Test {
public static void main(String[] args) {
double xlo = Double.parseDouble(args[0]);
double xhi = Double.parseDouble(args[1]);
double ylo = Double.parseDouble(args[2]);
double yhi = Double.parseDouble(args[3]);
int t = Integer.parseInt(args[4]);
Interval1D xinterval = new Interval1D(xlo, xhi);
Interval1D yinterval = new Interval1D(ylo, yhi);
Interval2D box = new Interval2D(xinterval, yinterval);
box.draw();
Counter c = new Counter();
for(int i = 0; i < t; i++) {
double x = Math.random();
double y = Math.random();
Point2D point = new Point2D(x, y);
if(box.contains(point))
c.increment();
else
point.draw();
}
System.out.println("落在矩形内的点有" + c.getCount() + "个");
System.out.println("该矩形的面积为:" + box.area());
}
}
public class Counter {
private int count;
public void increment() {
this.count++;
}
public int getCount() {
return this.count;
}
}
运行得到的结果如下
2:信息处理对象
面向对象编程一个很重要的思想就是“一切皆为对象”,如下例子,封装了一个Date类
class Date {
private int year;
private int month;
private int day;
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public int getMonth() {
return month;
}
public int getDay() {
return day;
}
@Override
public String toString() {
return "Date [year=" + year + ", month=" + month + ", day=" + day + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + day;
result = prime * result + month;
result = prime * result + year;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Date other = (Date) obj;
if (day != other.day)
return false;
if (month != other.month)
return false;
if (year != other.year)
return false;
return true;
}
}