【问题标题】:how to add objects of class to hashMap based on their values?如何根据它们的值将类对象添加到 hashMap?
【发布时间】:2012-09-29 05:11:49
【问题描述】:

我正在从数据库中检索一些值,这些值需要添加到列表中,然后根据它们的值添加到具有特定键的 MAP,例如,

row 1   name = "A" category = "1"
row 2   name = "B" category = "2"
row 3   name = "C" category = "1"
row 4   name = "D" category = "3"

我需要将第 1 行和第 3 行放在一个列表中,并将第 2 行和第 4 行分别放在一个单独的列表中,然后 将这三个列表放入 MAP 中,并使用类别名称 (1,2,3) 作为 MAP 的键。

MAP
   1 LIST1 (values of 2 rows)
   2 LIST2 (values of 1 row)
   3 LIST3 (values of 1 row)

我不确定如何将它们添加到列表和 MAP。 我的限制是,并非每次检索值时都会检索到相同的行,因此每次我可能需要不同数量的列表来保留已检索到的每个类别的值。

我的代码如下,

 ResultSet rs = st.executeQuery(SelectRows);
 Map map = new HashMap();
 if(rs.next())
 {
    item.setRowID(rs.getString("ID"));
    item.setName(rs.getString("Name"));                       
    item.setValue(rs.getString("Value"));
    item.setCat(rs.getString("Cat"));
    if(!map.containsKey(rs.getString("Cat"))){
        map.put(rs.getString("CatID"), new ArrayList());
    }
    map.get(rs.getString("CatID")).add(row);
 }

最后一行遇到此错误 > "" 方法 add(Rows) 未定义对象类型。 即使我将对象添加到列表中,我也会遇到同样的错误,方法 add(List) 未定义对象类型。

【问题讨论】:

  • @HussainAl-Mutawa,我尝试将它们添加到 MAP,但因为每次我得到不同的类别时都不确定如何创建列表并设置 MAP 的键。
  • 我的意思是,你能显示你的代码吗?您在尝试解决问题时可能做错了什么。
  • @HussainAl-Mutawa,感谢您的回答,我已经编辑了问题。
  • 查看我更新的答案,您需要投射从地图中获得的项目,或者提前定义泛型类型。

标签: java object hashmap


【解决方案1】:

您需要创建一个列表映射。在阅读记录时,如果存在键(这里是类别),则将当前行添加到列表中

 Map map = new HashMap()
 for( Row row : resultset ) {
      if(!map.containsKey(row.category)){
            map.put(row.category, new ArrayList());
      }
      map.get(row.category).add(row.name);
  }

更新

问题是你需要在这里指定泛型

 Map<String, List<Rows>> map = new HashMap<String, List<Rows>>()
 while( rs.next() ) {
      Rows row = new Rows();
      /*
       * code to initialize the values of row from the record
       */
      String category = rs.getString("Cat");
      if(!map.containsKey(category)){
            map.put(category, new ArrayList<Rows>());
      }
      map.get(category).add(row);
  }

【讨论】:

  • 实际上我正在为每一行创建一个对象,因为它们有很多列,并尝试将这些对象添加到代码中,但在最后一行出现错误。
【解决方案2】:

您可以使用以类别为键、列表的 ArrayList 作为值的映射。 ArrayList 在您添加时会自动更改大小。 Map 使用 put(key, value) 添加元素。 ArrayList 使用 add(element) 或 add(index, element)。

【讨论】:

  • 我有相同的计划,但正如我所说,每次可能会检索具有不同类别的不同行我如何命名列表并设置地图键?
  • 这是一个相关问题:stackoverflow.com/questions/1010879/…。如果您需要添加到地图中的列表,只需使用类别获取 ArrayList 并将新列表添加到末尾、删除列表或执行任何您需要的操作。此外,来自 Google Collections (google-collections.googlecode.com/svn/trunk/javadoc/…) 的 Multimap 允许您为同一个键添加多个值。
【解决方案3】:

我建议你在地图中使用地图

Map<Integer, Map<Integer, String>> map = new HashMap<Integer, Map<Integer,String>>();

外部映射将根据行和值的映射进行分类。这样每次您想根据行查找值时都可以轻松完成。

【讨论】:

    【解决方案4】:

    我们还可以使用数组列表和链接列表以及向量空间。

    Map<Integer, ArrayList<class-name(means object)>> map = new HashMap<>();
    
    Map<Integer, Vector<class-name(means object)>> map = new HashMap<>();
    
    Map<Integer, LinkList<class-name(means object)>> map = new HashMap<>();
    

    所以使用其中一个。

    【讨论】:

      【解决方案5】:

      我声明了一个数据类型为Map的变量,如下:

      Map params = new HashMap();
      

      之后,我可以添加如下对象:

      params.put("id", indicatorId);
      

      【讨论】:

        猜你喜欢
        • 2019-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        • 2020-03-09
        • 1970-01-01
        • 2018-02-26
        • 2019-05-17
        相关资源
        最近更新 更多