繁体   English   中英

使用java中的循环填充hashmap

[英]Populating hashmap with a loop in java

嗨,我有一个问题用循环填充hashmap,我需要将对象存储为值和字符串作为键,如果另一个元素想要添加到hashmap,则应该检查它,如果该值已经存在,如果是这样,它应该例如,将字符串键增加1:

("JButton", JButtonObject);

如果JButton应该是另一个元素想要添加

("JButton1", JButtonObject);
...
...
...

我的代码:谢谢你们

private void CreateInstance(java.awt.event.ActionEvent evt) {                                
    // add code here

    Object object = null;
    if (evt.getSource() == CreateInstance)
    {
        int[] selectedIx = ClassList.getSelectedIndices();
        for (int i=0; i<selectedIx.length; i++) {
                Object sel = ClassList.getModel().getElementAt(selectedIx[i]);
                try {
                      Class classDefinition = Class.forName(sel.toString());
                      object = classDefinition.newInstance();
                      //create name
                      String data = sel.toString();
                      String substring = data.substring(12);
                      //check if name is unique

                      //add to map
                      hm.put(substring, object);----- HERE IS THE PROBLEM
                      System.out.println();
                } 
                catch (InstantiationException e) {
                      System.out.println(e);
                  } 
                catch (IllegalAccessException e) {
                      System.out.println(e);
                  } 
                catch (ClassNotFoundException e) {
                      System.out.println(e);
             }
             if(object instanceof java.awt.Component){
                DesignWindow.add((java.awt.Component)object);
                DesignWindow.validate();
             }
             else{
                System.out.println("Error");
             }
        }
    }
}                        

定义结构:

Map<String,LinkedHashMap<String,Object>> map=new LinkedHashMap<String,LinkedHashMap<String,Object>>();

看起来像:

"Jbutton"--->#####################
             #"Jbutton" , object0#
             #"Jbutton1", object1#
             #"Jbutton2", object2#
             #####################

"JBox"  ---->##################
             #"JBox" , object0#
             #"JBox1", object1#
             #"JBox2", object2#
             ##################

然后在你的方法'CreateInstance'中使用它:

LinkedHashMap<String,Object> selectedMap=map.get(substring);
if(selectedMap==null){//First put in this kind of element
    selectedMap=new LinkedHashMap<String,Object>();
    map.put(substring, selectedMap);
}else{
    selectedMap.put(substring+ (selectedMap.size()==0? "":selectedMap.size()), object);
}

将“首选键”(例如“JButton”)的第二个HashMap保持为整数,然后使用整数来确定您当前使用的实际键的下一个后缀。

我不知道你的实际要求。 但也许这种为单个键存储多个对象的替代方法也可以工作,如果确实如此,它将使生活变得更加容易。 我不会构造不同的密钥,但使用一个密钥和该密钥的实例列表:

HashMap<String, List<Object>> hm = new HashMap<String, List<Object>>();

// ...

try {
  Class classDefinition = Class.forName(sel.toString());
  object = classDefinition.newInstance();
  //create name
  String data = sel.toString();
  String substring = data.substring(12);

  // new code added here:
  List<Object> objects = hm.get(substring);
  if (obejcts == null) {
    objects = new ArrayList<Object>();
    hm.put(substring, objects);
  }
  objects.add(object);

// continue with catches 

使用会有所不同,但您可以做所有想做的事情:

if (hm.get(substring) == null) { // no object stored for key substring }
int numberOfObjects = hm.get(substring).size();
Object firstObject = hm.get(substring).get(0);  // the first object for substring
List<Object> objects = hm.get(substring);  // all objects

也许你应该使用另一种结构,正如每个人所说。 但是为了做你想做的事:

String substring = data.substring(12);
//check if name is unique

// add this line
String uniqueKey = findUniqueKey(hm, substring);

//add to map with the calculated value
hm.put(uniqueKey, object);----- HERE IS THE PROBLEM

和...

private String findUniqueKey(Map<String, ?> map, String prefix)
{
   if (!map.containsKey(prefix))
      return prefix;
   int i = 1;
   while(true) { // or check i against a maximum
      String candidate = prefix + i;
      if (!map.containsKey(candidate))
         return candidate;
      i++;
   }
}

这样,您就可以将用于确定密钥的逻辑与其余代码分开。

旁注:尝试使用地图参考。 仅使用HashMap创建实例。 因此,您的代码不会与您需要的特定实现相关联:Map。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM