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