一 代码
package Counter;
import common.StdOut;
import common.StdRandom;
public class Counter implements Comparable<Counter> {
private final String name; // counter name
private int count = 0; // current value
public Counter(String id) {
name = id;
}
public void increment() {
count++;
}
public int tally() {
return count;
}
public String toString() {
return count + " " + name;
}
@Override
public int compareTo(Counter that) {
if (this.count < that.count) return -1;
else if (this.count > that.count) return +1;
else return 0;
}
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
int trials = Integer.parseInt(args[1]);
// create n counters
Counter[] hits = new Counter[n];
for (int i = 0; i < n; i++) {
hits[i] = new Counter("counter" + i);
}
// increment trials counters at random
for (int t = 0; t < trials; t++) {
hits[StdRandom.uniform(n)].increment();
}
// print results
for (int i = 0; i < n; i++) {
StdOut.println(hits[i]);
}
}
}
二 测试结果
F:\Algorithm\target\classes>java Counter.Counter 6 10000
1634 counter0
1632 counter1
1669 counter2
1674 counter3
1699 counter4
1692 counter5
三 说明
原始数字类型的实例变量默认值为0,布尔类型变量为false,引用类型变量为null。
抽象数据类型三步走:
1 定义一份API。
2 用一个Java类实现API的定义。
3 实现多个测试用例来验证前两步做出的设计决定。
四 一个简单计数器的抽象数据类型
public class Counter | |
Counter(String id) | 创建一个名为id的计数器 |
public void increment() | 将计数器的值加1 |
public int tally() | 计数器的值 |
public String toString() | 对象的字符串表示 |
五 典型用例
public class Flips {
public static void main( String[] args ) {
int T = Integer.parseInt(args[0]);
Counter heads = new Counter("heads");
Counter tails = new Counter("tails");
for (int t = 0;t<T;t++){
if(StdRandom.bernoulli(0.5)){
heads.increment();
}else {
tails.increment();
}
}
StdOut.println(heads);
StdOut.println(tails);
StdOut.println("delta:"+Math.abs(heads.tally()-tails.tally()));
}
}
六 数据类型的实现
public class Counter {
private final String name; // counter name
private int count = 0; // current value
public Counter(String id) {
name = id;
}
public void increment() {
count++;
}
public int tally() {
return count;
}
public String toString() {
return count + " " + name;
}
}
七 使用方法
F:\Algorithm\target\classes>java Flips.Flips 1000000
499336 heads
500664 tails
delta:1328
八 代码参考