Эффективное добавление символа в определенные места в строке MessageFormat с определенными условиями - PullRequest
0 голосов
/ 15 февраля 2019

Я использую класс Java FormatMessage для создания строки, которая принимает несколько операторов условия в качестве параметров, используя метод format ().С его помощью я создал термометр с использованием символов ASCII, который принимает случайное число в градусах Цельсия и в зависимости от этого числа вставляет символы звездочки в строку в определенных местах в зависимости от условия.Например, ((celsius >= 25)?"*":" ") Другими словами, звездочки обозначают уровень температуры в термометре в зависимости от значения температуры.

enter image description here

В настоящее время я использую аналогичные операторы if в каждом из 14 параметров, который затем определяет, следует ли добавить звездочку в указанном месте (temp> = местоположение) или пустое место (temp <= местоположение).Я уверен, что есть гораздо более эффективный и чистый способ сделать это, используя другой метод, например, встроенный для цикла, регулярного выражения, функции, встроенного метода и т. Д. </p>

Вот пример кода (остерегайтесьescape-символы):

    // random value between -35 and 40
    double celsius = Math.round(Math.random()*(40-35)-35);

    // ASCII Thermometer
    String meter = MessageFormat.format("     ______________________\r\n     |   ^F     _    ^C   |\r\n     |  100  - |{0}| -  40  |\r\n     |   90  - |{1}| -  30  |\r\n     |   80  - |{2}| -  25  |\r\n     |   70  - |{3}| -  20  |\r\n     |   60  - |{4}| -  15  |\r\n     |   50  - |{5}| -  10  |\r\n     |   40  - |{6}| -   5  |\r\n     |   30  - |{7}| -   0  |\r\n     |   20  - |{8}| -  -5  |\r\n     |   10  - |{9}| - -10  |\r\n     |    0  - |{10}| - -20  |\r\n     |  -10  - |{11}| - -25  |\r\n     |  -20  - |{12}| - -30  |\r\n     |  -30  - |{13}| - -35  |\r\n     |         '***`       |\r\n     |       (*****)      |\r\n     |        `---'        |\r\n     |____________________|\r\n\r\n",((celsius >= 35)?"*":" "), ((celsius >= 30)?"*":" "),  ((celsius >= 25)?"*":" "), ((celsius >= 20)?"*":" "), ((celsius >= 15)?"*":" "), ((celsius >= 10)?"*":" "), ((celsius >= 5)?"*":" "), ((celsius >= 0)?"*":" "), ((celsius >= -5)?"*":" "), ((celsius >= -10)?"*":" "), ((celsius >= -15)?"*":" "), ((celsius >= -20)?"*":" "), ((celsius >= -25)?"*":" "), ((celsius >= -30)?"*":" "));

1 Ответ

0 голосов
/ 15 февраля 2019

Вы хотите это?

public static void main(String[] args) {

    // random value between -35 and 40
    double celsius = Math.round(Math.random()*(40-35)-35);

    final String s = "     ______________________"
                        +"\r\n     |   ^F     _    ^C   |"
                        +"\r\n     |  100  - |{0}| -  40  |"
                        +"\r\n     |   90  - |{1}| -  30  |"
                        +"\r\n     |   80  - |{2}| -  25  |"
                        +"\r\n     |   70  - |{3}| -  20  |"
                        +"\r\n     |   60  - |{4}| -  15  |"
                        +"\r\n     |   50  - |{5}| -  10  |"
                        +"\r\n     |   40  - |{6}| -   5  |"
                        +"\r\n     |   30  - |{7}| -   0  |"
                        +"\r\n     |   20  - |{8}| -  -5  |"
                        +"\r\n     |   10  - |{9}| - -10  |"
                        +"\r\n     |    0  - |{10}| - -20  |"
                        +"\r\n     |  -10  - |{11}| - -25  |"
                        +"\r\n     |  -20  - |{12}| - -30  |"
                        +"\r\n     |  -30  - |{13}| - -35  |"
                        +"\r\n     |         '***`       |"
                        +"\r\n     |       (*****)      |"
                        +"\r\n     |        `---'        |"
                        +"\r\n     |____________________|"
                        ;

    final int [] celsiusDegreeCompare = new int[] {
        35,30,25,20,15,10,5,0
        ,-5,-10,-20,-25,-30,-35
    };

    final String[] parameters = new String[14];

    IntStream.range(0, parameters.length)
    .forEach(
        i -> {
            parameters[i] = (celsius >= celsiusDegreeCompare[i])? "*":" ";
        }
    )
    ;

    // ASCII Thermometer
    String meter = MessageFormat.format(s, parameters);

    System.out.println("celsius: " + celsius);
    System.out.println(meter);
}

Результат:

celsius: -31.0
     ______________________
     |   ^F     _    ^C   |
     |  100  - | | -  40  |
     |   90  - | | -  30  |
     |   80  - | | -  25  |
     |   70  - | | -  20  |
     |   60  - | | -  15  |
     |   50  - | | -  10  |
     |   40  - | | -   5  |
     |   30  - | | -   0  |
     |   20  - | | -  -5  |
     |   10  - | | - -10  |
     |    0  - | | - -20  |
     |  -10  - | | - -25  |
     |  -20  - | | - -30  |
     |  -30  - |*| - -35  |
     |         ***`       |
     |       (*****)      |
     |        `---        |
     |____________________|
...