Основанный на консоли прогресс Java [дубликат]

Уже есть ответ с RecursiveIteratorIterator . Но вот более оптимальное решение, которое избегает использования вложенных циклов :

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($arr),
    RecursiveIteratorIterator::SELF_FIRST
);
$path = [];
$flatArray = [];

foreach ($iterator as $key => $value) {
    $path[$iterator->getDepth()] = $key;

    if (!is_array($value)) {
        $flatArray[
            implode('.', array_slice($path, 0, $iterator->getDepth() + 1))
        ] = $value;
    }
}

Здесь необходимо сделать несколько замечаний. Обратите внимание на использование константы RecursiveIteratorIterator::SELF_FIRST здесь. Это важно, поскольку значение по умолчанию - RecursiveIteratorIterator::LEAVES_ONLY, которое не позволяет нам получить доступ ко всем ключам. Таким образом, с этим постоянным набором мы начинаем с верхнего уровня массива и углубляемся. Этот подход позволяет нам сохранять историю ключей и подготавливать ключ, когда мы разбираем листы, используя метод RecursiveIteratorIterator::getDepth .

Вот рабочая демонстрация.

35
задан easwee 6 January 2015 в 08:45
поделиться

5 ответов

Вы можете напечатать возврат каретки \ r , чтобы вернуть курсор в начало строки.

Пример:

public class ProgressDemo {
  static void updateProgress(double progressPercentage) {
    final int width = 50; // progress bar width in chars

    System.out.print("\r[");
    int i = 0;
    for (; i <= (int)(progressPercentage*width); i++) {
      System.out.print(".");
    }
    for (; i < width; i++) {
      System.out.print(" ");
    }
    System.out.print("]");
  }

  public static void main(String[] args) {
    try {
      for (double progressPercentage = 0.0; progressPercentage < 1.0; progressPercentage += 0.01) {
        updateProgress(progressPercentage);
        Thread.sleep(20);
      }
    } catch (InterruptedException e) {}
  }
}
53
ответ дан 27 November 2019 в 06:46
поделиться

I don't think there's a built-in capability to do what you're looking for.

There is a library that will do it (JLine).

See this tutorial

6
ответ дан 27 November 2019 в 06:46
поделиться

Я совершенно уверен, что нет никакого способа изменить что-либо, что консоль уже распечатала, потому что Java считает консоль (стандартную) как PrintStream.

4
ответ дан 27 November 2019 в 06:46
поделиться

Не знаю ни о чем, встроенном в саму java, но вы можете использовать управляющие коды терминала, чтобы делать такие вещи, как перемещение курсора. Некоторые подробности здесь: http://www.termsys.demon.co.uk/vtansi.htm

2
ответ дан 27 November 2019 в 06:46
поделиться

Очистите консоль, запустив специальную команду для ОС, а затем распечатайте новый процент

0
ответ дан 27 November 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: