簡體   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