【问题标题】:List key value with unique key as an object or enum将具有唯一键的键值作为对象或枚举列出
【发布时间】:2019-08-16 01:33:00
【问题描述】:

问题

  • 如果推荐的话,我想要一个键值对列表,例如 HashMap 或其他。

  • 此列表应包含用于检索值的唯一键对象。

  • 键不应该是字符串,因为字符串不是唯一的,可以传递任何值。

  • 此外,常量是有限的,并且也在使用字符串的概念,因此不应考虑。

示例

  • 想要的是例如 list[Color.Red] = "Red"。

  • 在这个阶段,我创建了一个包含所有键的枚举。 例如 enum Color{RED,BLUE} 然后将其添加到新的 HashMap 中。

  • 因此,获取颜色的唯一方法是将枚举用作键列表[Color.RED]。

实施

public final static Map<Color, String> colors = new HashMap<>();
public final static enum Color{RED, BLUE;}
static
{
   colors.put(RED, "red");
   colors.put(BLUE, "blue");
}
public static string getColor(Color color)
{
   return colors.get(color);
}

需要帮助

Java 中是否有一种 Collection 可以完成这项工作? 如果没有,那么最好的做法是什么?

【问题讨论】:

  • 您的示例是否真实,因为您希望Color.RED 返回“Red”的值?因为您可以覆盖.toString() 或向enum 添加方法以返回特定值,而枚举是一个数组,并且是唯一的。但是使用枚举作为键是限制输入的一种完全合法的方式。
  • 可以使用枚举的构造函数来添加值,所以映射是必不可少的。
  • 是的,你是对的,这就是这样做的方法,我在这个线程的末尾添加了一个潜在的解决方案。干杯!

标签: java list collections hashmap


【解决方案1】:

键在所有地图中都是唯一的。添加重复键,然后它会被覆盖。。各种映射实现之间的区别在于可能存在空键,迭代顺序和并发问题。

示例:

Map hm = new HashMap();
hm.put("1", new Integer(1));
hm.put("2", new Integer(2));
hm.put("3", new Integer(3));
hm.put("4", new Integer(4));
hm.put("1", new Integer(5));// value integer 1 is overwritten by 5

另外,Map key是通用的,你可以放你想要的,不仅仅是String,例如:

Map<Integer, String> hm = new HashMap<>();
hm.put(10, "1");

【讨论】:

  • 谢谢@davidr,在您的示例中,您基本上可以尝试检索列表中不存在的值。这是我们试图解决的问题。例如 hm.get(12);不会返回任何值。我们试图通过使用枚举作为键值对来强制开发人员仅输入存在的值。你的回答没有回答问题。
【解决方案2】:

可能的解决方案

在检查了枚举及其可能性之后,有一种方法可以将值分配给枚举中的 Key,例如 follow。

  • 创建一个新枚举并分配 Key,例如 public enum Color{RED;}。
  • 为其添加构造函数参数,例如 public enum Color{RED("red");}
  • 向枚举添加构造函数,例如 public enum Color{RED("red");颜色(){}}
  • 在枚举中添加一个名为 value 的新字段,例如 private String value; public String getValue() {返回值;}
  • 在枚举的构造函数中设置字段值,例如Color(String value) {this.value = value;}
  • Enum 以这种方式工作,对于您添加的每个 Key,它都会创建一个链接到该 Key 的新实例字段 String 值,然后它将使用您声明的构造函数来保存该值。

全面实施

public enum Color
{
   //[PROP]
   RED("red"),
   GREEN("green"),
   BLUE("blue");

   private String value;
   public String getValue {return value;}

   //[BUILD]
   Color(String value) {this.value = value;}

   //[UTIL]
   Color[] getKeys() {return this.values;} //values method is already a method existing in enum class, we are just proposing another method name here as a facade for simplicity.
}
  • 如果我们想要检索一个项目,我们只需简单地执行 Color.RED.value,这样只有现有的键会返回想要的值。
  • 请注意,value 不必是键的名称,但可以是完全不同的值。

如果您有任何更简单的解决方案而不增加解决方案的复杂性,请发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2019-02-17
    • 2022-01-09
    • 2020-09-06
    相关资源
    最近更新 更多