java - 键中有多个值的集合

标签 java collections

我正在寻找一个集合类型的数据结构来实现以下功能。假设我有一堂这样的课:

class Person() {

    String homeTown;   // key
    String sex;  // key 
    String eyeColour;  // key
    String name;
    long height;

    // other stuff....
}

我正在处理多个 Person 对象。我想将它们组织成集合,其中每个集合包含具有相同家乡、性别和眼睛颜色的 Person 对象。目前我正在实现这样的事情:

Map<String, HashSet<Person>> = new HashMap<String, HashSet<Person>>;

其中的关键是家乡、性别和眼睛颜色的串联。这可行,但看起来有点凌乱 - 谁能建议一个更优雅的解决方案或更好的数据结构来使用,谢谢?

最佳答案

您可以重组您的类以使 key 明确。这比简单地连接键值更强大,并且当您希望将 Person 实例存储在 Map 中时可以避免任何额外的对象创建开销,因为您已经提前创建了键。

public class Person {
  public class Key {
    private final String homeTown;
    private final String sex;
    private final String eyeColour;

    public Key(String homeTown, String sex, String eyeColour) { ... }

    public boolean equals(Object o) { /* Override to perform deep equals. */ }
    public int hashCode() { /* Could pre-compute in advance if the key elements never change. */ }
  }

  private final Key key;
  private final String name;
  private final long height;

  public Person(String homeTown, String sex, String eyeColour, String name, long height) {
    this.key = new Key(homeTown, sex, eyeColour);
    this.name = name;
    this.height = height;
  }

  public Key getKey() {
    return key;
  }

  public String getName() { return name; }
  public long getHeight() { return height; }
}

关于java - 键中有多个值的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995683/

相关文章:

java - 当匹配 java 中的正则表达式时,将函数应用于替换字符串

java - 如何使用 LocalTime.parse 解析任何格式的时间?

java - 如何在递归方法中返回 try-catch 内部?

java - 从 TreeSet 中删除一个对象

F# 中的 Python 风格集合

java - Morphia 返回字符串列表,这些字符串是所有文档的字段

java - 如何在字符串中插入特殊字符?

scala - 如何对集合元素的字段求和而不先映射它们(如 foldLeft/reduceLeft)?

java - 在Java中将元素拆分为不同数量的列表?

datetime - System.Collections 是我的场景的最佳选择