2010-08-25 88 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