Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果没有很多if语句,我如何获得颜色的名称?_Java_String_Colors - Fatal编程技术网

Java 如果没有很多if语句,我如何获得颜色的名称?

Java 如果没有很多if语句,我如何获得颜色的名称?,java,string,colors,Java,String,Colors,在我正在制作的一个游戏中,团队是以颜色命名的(例如红色、蓝色、青色)。我现在要做的是得到球员所在的球队的名字,并画出球员的名字和球队(以测试一切是否正常并找到bug)。现在,有一个错误:球员的名字和实际所在的球队颜色不一样。这就是它的用武之地;如果我能画出球员所在球队的名字,我可以通过找到球队的名字和球员的颜色来找出代码中哪里有错误。 这是我现在尝试获取团队名称的代码: import java.awt.Color; import java.util.ArrayList; public clas

在我正在制作的一个游戏中,团队是以颜色命名的(例如红色、蓝色、青色)。我现在要做的是得到球员所在的球队的名字,并画出球员的名字和球队(以测试一切是否正常并找到bug)。现在,有一个错误:球员的名字和实际所在的球队颜色不一样。这就是它的用武之地;如果我能画出球员所在球队的名字,我可以通过找到球队的名字和球员的颜色来找出代码中哪里有错误。
这是我现在尝试获取团队名称的代码:

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";
        }
    }

}
导入java.awt.Color;
导入java.util.ArrayList;
公开课小组{
ArrayList玩家;
颜色;
公共团队(ArrayList玩家,彩色){
这个。玩家=玩家;
这个颜色=颜色;
}
公共数组列表getPlayers(){
返回球员;
}
公共颜色getColor(){
返回颜色;
}
公共字符串getName(){
如果(颜色==color.red){
返回“红色”;
}
}
}

我能想到的实现这一点的唯一方法是在
getName()
方法中重复if语句,但这将花费大量时间进行循环和编码。

作为
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);
    }
}
classyourclass{
private static final Map COLOR_NAMES=new HashMap();
静止的{
COLOR_name.put(COLOR.red,“red”);
//
}
公共静态getName(颜色){
返回颜色名称。获取(颜色);
}
}
我可以推荐一张地图吗

Map<Color, String> colorNames = new HashMap<>();
您可以使用文本文件填充地图,也可以遍历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
下面是一种使用反射自动创建映射的方法

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
Map name=newhashmap();
Field[]fields=Color.class.getDeclaredFields();
用于(字段f:字段){
if(f.getType()==Color.class){
name.put((Color)f.get(Color.class),f.getName());
}
}
System.out.println(names.get(Color.YELLOW));
//黄色的

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

首先,你不能与
=
相比,因为颜色是一个类,而不是枚举。 请改用
.equals()
方法

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

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

public String getName() {
    return knownColorNames.getOrDefault(color, "unknown color name");
}
Map known颜色名称;//使用所有已知的颜色名称初始化
公共字符串getName(){
返回knownColorNames.getOrDefault(颜色,“未知颜色名称”);
}
如果颜色没有指定名称,则需要返回一些默认名称。

这可能会有帮助:

我改编了它:

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);
          }
       }
    } 
}
导入java.awt.Color;
导入java.lang.reflect.Field;
导入java.lang.reflect.Modifier;
导入java.util.HashMap;
公共班机{
公共静态void main(字符串[]args)引发IllegalAccessException{
clazz类=Color.Class;
Field[]colorFields=clazz.getDeclaredFields();
HashMap singleColors=新的HashMap();
用于(字段cf:颜色字段){
int modifiers=cf.getModifiers();
如果(!Modifier.isPublic(修饰符))
持续
Color c=(Color)cf.get(null);
如果(!singleColors.values().包含(c))
put(c,cf.getName());
}
System.out.printnln(“我的颜色:+getName(Color.BLUE));
}
公共字符串getName(颜色myColor){
对于(颜色c:singleColors.keySet()){
如果(c.equals(myColor)){
返回单色。获取(c);
}
}
} 
}
开关
您可以使用switch语句。然后在实例化时将名称另存为类player中的变量。

您可以使用反射

以下是“概念验证”代码:


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

enum Color {
        RED, GREEN, CYAN;

        @Override
        public String toString() {
            return super.toString().toLowerCase();
        }
}
在getName方法中,只需返回
color.toString()

不需要贴图或反射

尝试返回颜色。名称();还是类似的?@Stultuske没有
color.name()
或类似的东西;唯一的字符串是
color.toString()
,它返回
java.awt.color
。抱歉,我假设您使用的是枚举。你为什么不呢?@Stultuske我对enum没有太多经验,我也不知道在这种情况下如何实现它们。你为什么认为这需要很多时间?
java.awt.Color中只有十几种颜色
——只需编写
if
语句或使用
开关
(Color)f.get(Color.class)?
RED
BLUE 
enum Color {
        RED, GREEN, CYAN;

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