如何在没有大量if语句的情况下获取颜色的名称?

问题描述 投票:-3回答:7

在我正在制作的游戏中,团队以颜色命名(例如RED,BLUE,CYAN)。我现在要做的就是获取玩家所在团队的名称并绘制玩家的名字和团队(以测试一切是否正常并发现错误)。现在,有一个错误:玩家的名字与其实际上的团队的颜色不同。这就是它的来源;如果我可以绘制玩家所在团队的名称,我可以通过找到团队的名称与玩家的颜色相比,在我的代码中找到错误。 这是我现在的代码,试图获取团队的名称:

import java.awt.Color;
import java.util.ArrayList;

public class Team {

    ArrayList<Player> players;
    Color color;

    public Team(ArrayList<Player> players, Color color) {
        this.players = players;
        this.color = color;
    }

    public ArrayList<Player> getPlayers(){
        return players;
    }

    public Color getColor() {
        return color;
    }

    public String getName() {
        if(color == Color.red) {
            return "red";
        }
    }

}

我能想到实现这一目标的唯一方法是在getName()方法中重复if语句,但这需要花费大量时间来循环并花费大量时间来编写代码。

java string colors
7个回答
3
投票

首先你无法与==比较,因为Color是一个类,而不是枚举。请改用.equals()方法。

其次(出于同样的原因)您可以创建一个包含所有已知颜色名称的哈希表,并使用Color作为哈希键。

Map<Color, String> knownColorNames; // initialize with all known color names

public String getName() {
    return knownColorNames.getOrDefault(color, "unknown color name");
}

如果颜色没有指定名称,则需要返回一些默认名称。


2
投票

使用枚举而不是java.awt.color

enum Color {
        RED, GREEN, CYAN;

        @Override
        public String toString() {
            return super.toString().toLowerCase();
        }
}

在你的getName方法中,只需返回color.toString()。不需要地图或反射


1
投票

作为enum方法(我实际上更喜欢)的替代方法,您可以将名称放在地图中。

class YourClass {
    private static final Map<Color, String> COLOR_NAMES = new HashMap<>();

    static {
        COLOR_NAMES.put(Color.red, "red");
        //
    }

    public static getName(Color color) {
        return COLOR_NAMES.get(color);
    }
}

1
投票

这可能会有所帮助:http://www.java2s.com/Tutorials/Java/Data_Type_How_to/enum/Loop_through_Color_enum_and_printing_values_Different_ways_of_doing_it.htm

我改编了:

import java.awt.Color;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;

public class Main {
  public static void main(String[] args) throws IllegalAccessException {
    Class clazz = Color.class;
    Field[] colorFields = clazz.getDeclaredFields();

    HashMap<Color, String> singleColors = new HashMap<>();
    for (Field cf : colorFields) {
      int modifiers = cf.getModifiers();
      if (!Modifier.isPublic(modifiers))
        continue;

      Color c = (Color) cf.get(null);
      if (!singleColors.values().contains(c))
        singleColors.put(c, cf.getName());
    }
    System.out.printnln("My Color: " + getName(Color.BLUE));
  }

  public String getName(Color myColor) {
      for (Color c : singleColors.keySet()) {
          if (c.equals(myColor)) {
              return singleColors.get(c);
          }
       }
    } 
}

1
投票

我可以建议一张地图。

Map<Color, String> colorNames = new HashMap<>();

然后填充地图。

colorNames.put(Color.BLUE, "blue");


public String getName(Color c){
    return colorNames.computeIfAbsent(c, key->Long.toHexString(key));
}

您可以使用文本文件填充地图,也可以浏览Color类并使用反射获取所有静态字段。

这是一种使用反射自动创建映射的方法。

Map<Color, String> names = new HashMap<>();
Field[] fields = Color.class.getDeclaredFields();
for(Field f: fields){
    if(f.getType()==Color.class){
        names.put((Color)f.get(Color.class), f.getName());
    }
}

System.out.println(names.get(Color.YELLOW));
//YELLOW

请注意,由于名称冲突,某些颜色可能会被覆盖。例如。黑色和黑色。


1
投票

你可以用反射......

这是“概念证明”代码:

public static void main ( String [] args ) throws IllegalArgumentException, IllegalAccessException
    {
        Field [] names = Color.class.getFields();
        HashMap<Color,String> list=new HashMap<Color,String>();
        for ( Field name: names ){
                try{
                    list.put((Color)Color.class.getDeclaredField(name.getName()).get(null),name.getName());
                }catch (NoSuchFieldException e){}
            }
            System.out.println( list.get(Color.RED));
            System.out.println( list.get(Color.BLUE));
    }

输出:

RED
BLUE 

0
投票

switch您可以使用switch语句。然后在实例化时将名称保存为类播放器中的变量。

© www.soinside.com 2019 - 2024. All rights reserved.