用Java实现里程表

时间:2012-02-07 20:42:17

标签: java permutation

我正在研究用Java创建里程表式应用程序的想法。

基本上我知道我可以使用一系列循环来控制旋转,但我想用数学方法做这件事。

因此,如果每个表盘旋转十次,从0到9,并且有六个刻度盘,如果我的数学运算正确的话,总共应该有1000000个旋转。

Math.pow(10, 6);

我的问题是;什么是跟踪最后一个表盘旋转的最有效方法,因为像一系列真正的齿轮一样,对于最后一个表盘的每十匝,最后一个表盘将转一次。

然后,对于从最后一次拨号开始的第二次转动,第三次转动将从最后一次转动,然后其他所有其他转动将重置为零。

有任何建议或意见吗?

3 个答案:

答案 0 :(得分:4)

建议的实现

没有必要使模型更复杂,只是为了机械地重新创建对象。请参阅John3136的答案以获得佐证。

轮换模型可以简单如下:

int rotations = 0;

/**
 * Increment rotations every rotation
 */
void rotate() {
    rotations++;
    if (rotations >= Math.pow(10, 6)) // consider extracting as constant
        rotations = 0; // reset
}

然后创建视图

/**
 * dial can be from 1 .. 6 (where dial 1 moves every rotation)
 */
int getDialPosition(int dial) {
    int pow = Math.pow(10, dial);
    return Math.floor((rotations % pow) / (pow / 10));
    // above gets the digit at position dial
}

备注

  • 将上述模型包装到里程表类
  • 构建一个每次轮换刷新的视图

答案 1 :(得分:1)

回想一下设计和关注点的分离。你在这里有一个0到9999999之间的数字显示。里程表只是这个数字的“视图”。 我创建了我的模型(保存一个数字,并有一些增加数字的方法),然后编写一个视图,以我选择的任何GUI样式显示它。

答案 2 :(得分:0)

您可以使用composite pattern创建一个类,其中每个计数器都可以包含一个嵌套的子计数器 当子项被添加到父项时,父项将自己注册到子项,以便每次子项计数器移动到零阈值时接收递增和递减事件。