Counter抽象数据类型的实现

一 代码

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

八 代码参考

https://gitee.com/cakin24/Algorithm

发布了4080 篇原创文章 · 获赞 538 · 访问量 296万+

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/103939918