Como criar um temporizador de dois dígitos?

Eu sei como fazer um temporizador de 1 dígito [1:9:0], mas como eu posso fazer um temporizador de 2 dígitos [19:39:01] sem usar um monte de condições?

Como vc fez esse de 1 dígito?

public static void main(String[] args) throws InterruptedException {
int s = 0;
int m = 0;
int h = 0;
for (int i = 0; i < 10000; i++) {
  s++;
  if (s == 60) {
    s = 0;
    m++;
  }
  if (m == 60) {
    m = 0;
    h++;
  }
  System.out.println("[" + h + ":" + m + ":" + s + "]");
  Thread.sleep(1000);
  }
}

Você percebe que ele imprime no começo 0:0:1, mas eu queria ter uma ideia de como imprimir com 2 dígitos 00:00:01

Você pode utilizar a classe LocalTime (https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html) para isto!

Um exemplo seria:

class Main {
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            Thread.sleep(1000);
            timeCounter();
        }
    }

    public static void timeCounter() {
        LocalTime time = LocalTime.now();
        int hor = time.getHour();
        int min = time.getMinute();
        int sec = time.getSecond();

        StringBuilder sb = new StringBuilder();
            sb.append("[").append((hor < 10) ? "0"+hor : hor)
            .append(":").append((min < 10) ? "0"+min : min)
            .append(":").append((sec < 10) ? "0"+sec : sec)
            .append("]");

        System.out.println(sb.toString());
    }
}

Isso funciona com um efeito similar, atente-se a parte do código onde eu construo a string com o StringBuilder, é usado operadores ternários para fazer uma avaliação, se o número for menor que 10, adicione um zero na frente.

1 curtida

While (true), como funciona isso?

E o que o String builder?

Esta é uma forma de criar um loop infinito.

O código que vc mostrou vai rodar por apenas um certo perido de tempo (10000 minutos) e vai parar.

Usando um loop infinito, seu contador só pararia caso o programa fosse encerrado ou caso uma certa condição dentro do loop seja satisfeita. Por exemplo:

while(true) {
  s++;

  if (s == 60) {
    s = 0;
    m++;
  }

  if (m == 60) {
    m = 0;
    h++;
  }

  if (h == 3) {
    break;
  }
}

O código acima pararia apenas depois de 3 horas terem se passado, isso acontece por causa do break.

Strings em Java são imutaveis e cada vez que vc as concatena, uma String completamente nova é criada e isso pode ser custoso quando vc faz varias concatenações sucessivas.

O StringBuilder é uma forma mais eficiente pra vc realizar essas concatenações.

Sobre seu código

Seu código está perfeito do jeito que está, a única mudança que vc precisa fazer é usar o printf no lugar do println. Ficaria assim:

public static void main(String[] args) throws InterruptedException {
  int s = 0;
  int m = 0;
  int h = 0;

  while (true) {
    s++;

    if (s == 60) {
      s = 0;
      m++;
    }

    if (m == 60) {
      m = 0;
      h++;
    }

    System.out.printf("[%02d:%02d:%02d]\n", h, m, s);
    Thread.sleep(1000);
  }
}

Créditos: O truque com %02d eu descobri hoje bem aqui: https://stackoverflow.com/a/473309/3334365

2 curtidas