[英]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.