Тернарный оператор для цвета сетки в массиве, чтобы быть определенного цвета (несколько условий) Java - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю графический интерфейс для отображения карты с помощью GridLayout и хотел бы отображать ее в разных цветах.На данный момент у меня это так, если число в массиве равно 0, цвет этого конкретного квадрата будет черным.Если это любой другой номер, он будет серым.Как вы можете видеть, это будет очень скучная сеточная карта.Есть ли способ взять эту строку кода и сделать так, чтобы каждое число могло представлять цвет?Например, я хотел бы, чтобы 0 равнялся черному, 1 равнялся серому, 2 равнялся синему, 3 равнялся красному, 4 равнялся зеленому и т. Д. Это то, что я имею сейчас.

Color color =данные [r] [c] == 0?Color.BLACK: Color.gray;

Я знаю, что мог бы просто использовать оператор if, чтобы определить, какой цвет помещается туда на основе числа, но я знаю, что есть способ сделать это, используя троичный оператор.Кто-нибудь знает как?Спасибо.

Ответы [ 4 ]

0 голосов
/ 08 декабря 2018

У вас есть значение int.И вы хотите получить Color для этого значения int.

Вы могли бы использовать для этого if -ставления:

if (value == 0) color = Color.RED;
if (value == 1) color = Color.GREEN;
if (value == 2) color = Color.BLUE;

Вы могли бы использовать для этого оператор switch:

switch (value) {
    case 0: color = Color.RED; break;
    case 1: color = Color.GREEN; break;
    case 2: color = Color.BLUE; break;
}

Вы могли бы использовать для этого троичный оператор:

color = (value==0?Color.RED:(value==1?Color.GREEN:value==3?Color.BLUE)));

(не делайте этого ...)

Вы могли бы использовать для этого Map:

Map<Integer, Color> colorMap = mapWith(
    0, Color.RED, 
    1, Color.GREEN, 
    2, Color.BLUE);
...
Color color = colorMap.get(value):

Но сделайте шаг назад и посмотрите на то, что вы пытаетесь достичь: Выхотите где-нибудь добавить значение int и получить Color.Итак, напишите функцию

private static Color colorFor(int value) {
    ...
}

Затем, где вам нужен цвет, просто напишите

Color color = colorFor(value);

Реализуете ли вы функцию colorFor, используя if, switch, aтроичный оператор или Map тогда уже не имеет большого значения.Вы можете легко переключать реализации.


«Дополнительно»:

Вы также можете пойти еще дальше и извлечь реальную функцию: когда вы хотите преобразовать int вColor, то это именно то, что обозначено IntFunction.

На первый взгляд это может показаться излишним абстракцией.Но я думаю, что это не так (иначе я бы не написал это в качестве ответа).

Таким образом, вы можете определить свой IntFunction, как хотите, и в той точке кода GUI, где у вас естьзначение int и Color, вам нужно просто

Color color = colorFunction.apply(value);

Возможное преимущество этого состоит в том, что вы можете легко переключать схему окраски извне, например:

class YourGui {

    // Initialize with some default  
    private IntFunction colorFunction = YourGui::colorFor; 

    // The function as described above
    private static Color colorFor(int value) {
        ...
    }

    void setColorScheme(IntFunction colorFunction) {
        this.colorFunction = colorFunction;
    }
}

А затем позвоните

yourGui.setColorScheme(colorFunctionWith(CYAN, MAGENTA, YELLOW));

, чтобы изменить схему окраски ячеек.

0 голосов
/ 07 декабря 2018

Сколько цветов мы говорим?

Если это небольшое количество цветов, просто поместите их в карту.

Map<Integer, Color> colorMap = Map.of(0, Color.BLACK, 1, Color.GRAY, 2, Color.BLUE, 3, Color.RED, 4, Color.GREEN); // Java >= 9
Color color = colorMap.getOrDefault(data[r][c], Color.gray):
0 голосов
/ 07 декабря 2018

Объявите этот массив:

Color[] colors = {  
    Color.BLACK, Color.WHITE, Color.LIGHT_GRAY, Color.GRAY,
    Color.DARK_GRAY, Color.RED, Color.PINK, Color.ORANGE, 
    Color.YELLOW, Color.GREEN, Color.MAGENTA, Color.CYAN, Color.BLUE
};

Все значения этого массива являются Color константами из Color.java, и вы можете их переставить.Теперь установите цвет следующим образом:

Color color = colors(data[r][c] % colors.length);

для любого целого значения data[r][c], то есть> = 0.

0 голосов
/ 07 декабря 2018

Как насчет:

Map<Integer, Color> colors = new HashMap(); 
colors.put(0, Color.BLACK);
//...

function Color getColor(Integer i)
{
    return colors.containsKey(i)? colors[i] : Color.gray;
}

Может ли это помочь вам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...