【问题标题】:Add user defined object as key in hashmap在 hashmap 中添加用户定义的对象作为键
【发布时间】:2020-05-08 05:26:55
【问题描述】:
public class Dashboard {
int REQUEST_ID, PRICE;           
String LOGIN_USER;

public int getREQUEST_ID() {
 return REQUEST_ID;
}

public void setREQUEST_ID(int rEQUEST_ID) {
 REQUEST_ID = rEQUEST_ID;
 }

 //all getters and setters
public class DBConnection {
public ArrayList<Dashboard>  getStoreResult() {
  ArrayList<Dashboard> dashRec=new ArrayList<Dashboard>();
  Dashboard dash = new Dashboard();

try{
  Class.forName("");
  Connection con=DriverManager.getConnection("");
  Statement st=con.createStatement();
  ResultSet rs=st.executeQuery("");

  HashMap<Object, List<Dashboard>> map = new HashMap<>();
  while (rs.next()) {
    Integer id = rs.getInt(1);
    if (!map.containsKey(id)) {
        dashRec= new ArrayList<Dashboard>();
        map.put(id, dashRec);
    }
    dash = new Dashboard();
    dash.setREQUEST_ID(id);
    dash.setLOGIN_USER(rs.getString(2));
    dash.setPRICE(rs.getInt(3));
    map.get(id).add(dash);
     } 
    }

我想为每组行添加名称和 Reqid 作为 map 中的键对象。因此,对于 id 123,我需要一个 id=123,Name=A 作为键的映射。值将是包含所有行的 arraylist特定于 id。对于 id=123,arraylist 包含前 3 行作为 3 个对象。我现在想为所有行集添加 id 123 和 name 作为键。

【问题讨论】:

  • 你想要一个复合键(id+name)作为 mapKey 吗?
  • @CodeScale 是的,我想要

标签: java object arraylist hashmap


【解决方案1】:

您可以将密钥具体化为特定类型。

public class MapKey {
  private Integer id;
  private String name;

  MapKey(Integer id, String name) {
    this.id = id;
    this.name = name;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MapKey mapKey = (MapKey) o;
    return Objects.equals(id, mapKey.id) &&
            Objects.equals(name, mapKey.name);
  }

  @Override
  public int hashCode() {
    return Objects.hash(id, name);
  }
}

然后将此对象用作地图的键。

map.put(new MapKey("", 0), new Dash...);

ps:不要忘记最重要的部分 --> 在MapKey 中正确覆盖equalshashcode

提取:

MapKey key = new MapKey(rs.getInt(1), rs.getString(2));
if (!map.containsKey(key)) {
    dashRec= new ArrayList<Dashboard>();
    map.put(key, dashRec);
}

【讨论】:

  • 我是java新手,你能告诉我上面的代码在我提供的代码中是如何工作的吗?
  • 从结果集中提取“名称”?
  • 它被提取出来了
  • 所以公共类 MapKey 是我需要创建的另一个类。因为我有一个类仪表板,它具有每个属性的 getter 和 setter。
  • 你想要一个组合键作为你的哈希图你可以使用 MapKey 类型(ID + NAME)。你根据结果集构造这个keynew MapKey(rs.getInt(1), rs.getString(2))还有什么不清楚的?
【解决方案2】:

试试这个以获得独特性

public class Dashboard {
int REQUEST_ID, PRICE;           
String LOGIN_USER;

public int getREQUEST_ID() {
 return REQUEST_ID;
}

public void setREQUEST_ID(int rEQUEST_ID) {
 REQUEST_ID = rEQUEST_ID;
 }


  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Dashboard dash = (Dashboard) o;
    return Objects.equals(REQUEST_ID, dash.REQUEST_ID) && Objects.equals(LOGIN_USER, dash.LOGIN_USER) && && Objects.equals(PRICE, dash.PRICE);
  }

  @Override
  public int hashCode() {
    return Objects.hash(REQUEST_ID, PRICE+","+LOGIN_USER
    );
  }


 }

【讨论】:

  • 那么DBConnection类需要做哪些修改呢?
  • 您能告诉我在 DBConnection 类中必须进行哪些更改吗??
【解决方案3】:

@阿齐兹

试试这个

 //all getters and setters
public class DBConnection {
public ArrayList<Dashboard>  getStoreResult() {
  ArrayList<Dashboard> dashRec=new ArrayList<Dashboard>();
  Dashboard dash = new Dashboard();

try{
  Class.forName("");
  Connection con=DriverManager.getConnection("");
  Statement st=con.createStatement();
  ResultSet rs=st.executeQuery("");

  HashMap<Object, List<Dashboard>> map = new HashMap<>();

while (rs.next()) {

     Integer id = rs.getInt(1);
    Set<Dashboard> keysets = map.keySet();
    Dashboard d = null;
    for (Dashboard dash : keysets) {
        if(dash.getREQUEST_ID().equals.(id)){
            d = dash;
            break;
        }
    }

    Dashboard dash1 = new Dashboard();
    dash1.setREQUEST_ID(id);
    dash1.setLOGIN_USER(rs.getString(2));
    dash1.setPRICE(rs.getInt(3));

    if(d!=null){
        map.get(d).add(dash1)
    }else{
        List<Dashboard> lst = new ArrayList<>();
        lst.add(dash1);
        map.put(dash1,lst)
    }
    }
}   

【讨论】:

  • 是的,根据您的要求,我使用 Dashborad 作为键,每次您获得 rs.next 时,我都会检查对象是否已在键集中,如果是的话。然后我简单地在关联列表中添加对象,如果不只是创建一个新列表来添加
  • 哦,明白了。感谢您的帮助
  • 你能回答这个问题吗?它与你在这里的答案有关。 stackoverflow.com/questions/61851846/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多