1

私は困惑しているこの宿題を持っています。2 つのnumberDisplayオブジェクト で構成される24 時間時計があります。numberDisplayオブジェクトには、それらをロールオーバーするリミッターがあるため、分が 60 に達すると、0 にロールバックして時間を増やします。時間が 24 になると、0 に戻ります。

私はそれを 24 時間時計から 12 時間時計に変更する任務を負っていますが、オブジェクトについては何も変更できません。彼らがどのように相互作用するかだけ

私はこれまでこれを管理してきました:

private void updateDisplay()
{
    int functionHours = Integer.parseInt(hours.getDisplayValue());
    String amPM = "AM";
    if ( functionHours == 0 ) {
        hours.setValue(12);
        amPM = "AM";
    }
    else if ( functionHours > 0 && functionHours < 12 )
    {
        hours.setValue(functionHours);
        amPM = "AM";
    }
    else if ( functionHours == 12 ) {
        hours.setValue(functionHours);
        amPM = "PM";
    }
    else if ( functionHours > 12 && functionHours <= 23 ) {
        functionHours -= 12;
        hours.setValue(functionHours);
        amPM ="PM";
    }
    displayString = hours.getDisplayValue() + ":" + minutes.getDisplayValue() + " " + amPM;
}

ただし、hours.value が 23 から 0 に戻ると、時計は AM に戻ることを拒否します。これを達成する方法に困惑しています。

NumberDisplay オブジェクト:

/**
 * The NumberDisplay class represents a digital number display that can hold
 * values from zero to a given limit. The limit can be specified when creating
 * the display. The values range from zero (inclusive) to limit-1. If used,
 * for example, for the seconds on a digital clock, the limit would be 60, 
 * resulting in display values from 0 to 59. When incremented, the display 
 * automatically rolls over to zero when reaching the limit.
 * 
 * @author Michael Kölling and David J. Barnes
 * @version 2011.07.31
 */
public class NumberDisplay
{
    private int limit;
    private int value;

    /**
     * Constructor for objects of class NumberDisplay.
     * Set the limit at which the display rolls over.
     */
    public NumberDisplay(int rollOverLimit)
    {
        limit = rollOverLimit;
        value = 0;
    }

    /**
     * Return the current value.
     */
    public int getValue()
    {
        return value;
    }

    /**
     * Return the display value (that is, the current value as a two-digit
     * String. If the value is less than ten, it will be padded with a leading
     * zero).
     */
    public String getDisplayValue()
    {
        if(value < 10) {
            return "0" + value;
        }
        else {
            return "" + value;
        }
    }

    /**
     * Set the value of the display to the new specified value. If the new
     * value is less than zero or over the limit, do nothing.
     */
    public void setValue(int replacementValue)
    {
        if((replacementValue >= 0) && (replacementValue < limit)) {
            value = replacementValue;
        }
    }

    /**
     * Increment the display value by one, rolling over to zero if the
     * limit is reached.
     */
    public void increment()
    {
        value = (value + 1) % limit;
    }
}
4

2 に答える 2

2

hours.getDisplayValue() == 23あなたのコードで何が起こるか考えてみてください。最後のブロックでは、次のように変更します。

// functionHours is 23.
else if ( functionHours > 12 && functionHours <= 23 ) { // OK
    functionHours -= 12;  // now functionHours is 11
    hours.setValue(functionHours); // set hours.value to 11 !!
    amPM ="PM";

次の更新では、おそらくhours.value1 ずつ増加し、その値は になります12。ただし、コードでは、amPM が「AM」になるには、その値が 12 未満である必要があります。そのため、「PM」のままです。

私はあなたの要件を正確に理解していませんが、おそらくhoursオブジェクトの値を変更するべきではなく、代わりにデコレータ パターンを使用して 12 時間の機能を追加するべきです。

于 2013-02-28T06:01:08.733 に答える
0

論理をありがとう、理にかなっています。私はこのようにしました:

/**
 * Update the internal string that represents the display.
 */
private void updateDisplay()
{
    int functionHours = Integer.parseInt(hours.getDisplayValue());
    if ( functionHours == 0 ) {
        displayString = "12:" + minutes.getDisplayValue() + " AM";
    }
    else if ( functionHours >= 0 && functionHours < 12 ) {
        displayString = hours.getDisplayValue() + ":" + minutes.getDisplayValue() + " AM";
    }
    else if ( functionHours == 12 ) {
        displayString = hours.getDisplayValue() + ":" + minutes.getDisplayValue() + " PM";
    }
    else if ( functionHours >= 12 && functionHours < 22 ) {
        int tempHours = ( hours.getValue() - 12 );
        displayString = "0" + Integer.toString(tempHours) + ":" + minutes.getDisplayValue() + " PM";
    }
    else if ( functionHours >21 && functionHours < 24 ) {
        displayString = hours.getDisplayValue() + ":" + minutes.getDisplayValue() + " PM";
    }      
}
于 2013-02-28T06:33:21.643 に答える