【问题标题】:Ternary Operator for grid color in array to be a specific color (multiple conditions) Java数组中网格颜色的三元运算符为特定颜色(多个条件)Java
【发布时间】:2019-05-09 14:27:44
【问题描述】:

我正在构建一个 GUI 以使用 GridLayout 显示地图,并希望以不同的颜色显示它。截至目前,我有它,所以如果数组中的数字等于 0,则该特定正方形的颜色将为黑色。如果它是任何其他数字,它将是灰色的。如您所见,这将是一个非常无聊的网格图。有没有办法把这行代码做成这样,如果每个数字都可以代表一种颜色?比如我想要0代表黑色,1代表灰色,2代表蓝色,3代表红色,4代表绿色等等。这就是我现在所拥有的。

颜色 color = data[r][c] == 0 ? Color.BLACK : Color.gray;

我知道我可以使用 if 语句根据数字确定将哪种颜色放在那里,但我知道有一种方法可以使用三元运算符。有谁知道怎么做?谢谢。

【问题讨论】:

  • 可以使用嵌套三元组解决它:color = (x==0?BLACK:(x==1?RED:(x==.. ))..)。但是您应该这样做。这里有什么理由强制使用三元运算符吗?
  • 不,没有,我只是认为这会更容易,但我对三元运算符的了解有限。在这里使用大量的 if 语句是不是很理想?

标签: java arrays 2d grid-layout ternary-operator


【解决方案1】:

您有一个int 值。并且您想为此 int 值获取 Color

可以为此使用if-statements:

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);

您是否使用ifswitch、三元运算符或Map 来实现colorFor 函数就不再重要了。您可以轻松切换实现。


“高级”:

你还可以更进一步,拿出实际的功能:当你想将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));

更改单元格着色方案。

【讨论】:

    【解决方案2】:

    声明这个数组:

    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.javaColor常量,你可以重新排列它们。
    现在像这样设置颜色:

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

    data[r][c] 的任何整数值 >=0。

    【讨论】:

      【解决方案3】:

      我们在谈论多少种颜色?

      如果颜色数量不多,只需将它们放入地图中即可。

      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):
      

      【讨论】:

      • 不多,我会说大约 10 个,可能不会全部使用,但会很高兴。
      • 没关系。但是颜色的数量是有限的。但如果性能更重要,请使用 If、Switch 或对齐的嵌套三元运算符。
      【解决方案4】:

      怎么样:

      Map<Integer, Color> colors = new HashMap(); 
      colors.put(0, Color.BLACK);
      //...
      
      function Color getColor(Integer i)
      {
          return colors.containsKey(i)? colors[i] : Color.gray;
      }
      

      对你有帮助吗?

      【讨论】:

        猜你喜欢
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        相关资源
        最近更新 更多