2010-08-25 128 views
4

您好我有一個問題,使用循環填充hashmap,我需要將對象存儲爲值並將字符串存儲爲鍵,如果另一個元素想要添加到散列表中,應該對其進行檢查,如果該值已經存在,如果是的話,應該由1例如遞增的字符串鍵:在Java中使用循環填充hashmap

("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"); 
      } 
     } 
    } 
}       

回答

0

也許你應該使用別人說的另一種結構。但對於做你想要什麼:

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。

+0

非常感謝你的幫助伴侶,現在我弄明白了 – HAMID 2010-08-26 06:36:03

1

保持第二個HashMap的'首選鍵'(例如, 「JButton」)轉換爲整數,然後使用整數來確定您將使用的實際鍵的下一個後綴。

2

定義的結構:

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); 
} 
+0

如果第二個結構只是名稱加上增加的索引,則不需要使用第二個HashMap。一個ArrayList就足夠了,因爲在查找時你必須解析出字符串和索引...... – 2010-08-25 06:46:16

+0

非常感謝你的幫助 – HAMID 2010-08-26 06:36:56

0

我不知道你的實際需求。但也許這種爲單個密鑰存儲多個對象的替代方法也適用,如果這樣做,它會使生活變得更容易。我不會構建不同的密鑰,但使用一個密鑰,該密鑰的實例列表:

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 
+0

非常感謝你的幫助 – HAMID 2010-08-26 06:37:21