2017-06-26 50 views
1

我有這樣的代碼在地圖鍵用繩子從地圖值替換字符串

import java.util.*; 

public class Tester { 
public static void main(String[] args) { 

    HashMap<String, String> data=new HashMap(); 
    data.put("Chance to Avoid Fire Damage when Hit", "(3-7)%"); 
    data.put("Chance to Avoid Cold Damage when Hit", "(6-8)%"); 
    data.put("Chance to Avoid Chaos Damage when Hit", "(6-7)%"); 
    data.put("Adds # to # Fire Damage to Spells", "{\"min\":10,\"avg\":20,\"max\":30}"); 
    data.put("Adds # to # Cold Damage to Curses", "{\"avg\":20,\"max\":30,\"min\":10}"); 
    data.put("Adds # to # Cold Damage to Curses", "{\"avg\":30,\"max\":20,\"min\":40}"); 
    data.put("Adds # to # Physical Damage to Weapon", "{\"min\":8,\"max\":32,\"avg\":20}"); 
    data.put("Curse Enemies with Vulnerability on level", "30"); 

} 
} 

我們老師要求我們做的方法,將取代每個第一「#」與他的最小值,第二個「#」最大值爲 ex:「對法術增加10到30點火焰傷害......」 我一直在做錯了幾個小時,真的需要一些幫助 這就是我迄今爲止所做的(我知道它可能不好):

public class Exe2 { 
public static String replaceH(Map<String, String> mods) { 
    Set<String> modss = new HashSet(); 
    String z=""; 
    String[] keys = mods.keySet().toArray(new String[0]); 
    String key = mods.get(keys); 
    for (String n : keys) { 
     if(n.contains("#")){ 
      z= n.replace("#",key.indexOf(5)); 

     } 
    } 
    return z; 
} 

} 

會真的很感激你的hel p,謝謝:)

+2

注意的是,現實生活中的解決方案是使用一個更好的數據結構 – Aaron

+0

你不需要'toArray',只需用'鍵設置( )'直接。 –

+1

你也混淆了你的變量名:你的''key'變量實際上是一個映射項值。而且你對一個索引進行硬編碼,如果'#'的位置改變了,這是不正確的。看看'Map.entrySet',我相信它擁有你所需要的幾乎所有的一切。你可以從那裏拿起它很容易。 –

回答

0

你必須用循環中的散列號#刪除舊密鑰。 然後插入帶有替換值的密鑰。

由於在循環中同時刪除和插入可能會有問題,您可以使用新結果構建第二個映射,或者反過來,首先從原始映射中複製(關於)鍵。

要從最小值和最大值檢索,可以使用正則表達式模式匹配:value.replaceFirst("...", "$1");或更困難value.indexOf("max")/substring

0

首先,你應該在一個地圖使用respeated鍵所以這就是爲什麼我獲得三個輸出,而不是4.

其次,爲了使問題更簡單,你應該使用相同的模式:

package tests; 
import java.util.*; 
public class Tester { 

    public static void main(String[] args) { 
     getFinal(initial(data)); 

    } 
public static Map<String,String> initial(Map<String,String>a){ 
      a.put("Chance to Avoid Fire Damage when Hit","(3-7)%"); 
      a.put("Chance to Avoid Cold Damage when Hit", "(6-8)%"); 
      a.put("Chance to Avoid Chaos Damage when Hit", "(6-7)%"); 
      a.put("Adds # to # Fire Damage to Spells", "{\"avg\":20,\"max\":30,\"min\":10}"); 
      a.put("Adds # to # Cold Damage to Curses", "{\"avg\":20,\"max\":30,\"min\":10}"); 
      a.put("Adds # to # Cold Damage to Curses", "{\"avg\":30,\"max\":20,\"min\":40}"); 
      a.put("Adds # to # Physical Damage to Weapon", "{\"avg\":20,\"max\":32,\"min\":8}"); 
      a.put("Curse Enemies with Vulnerability on level", "30"); 
      return a; 
     } 

public static Map<String,String>getFinal(Map<String,String>b){ 
     List<String>aux=new ArrayList<String>(b.keySet()); 
     List<String>aux1=new ArrayList<String>(b.keySet()); 
     for(int i=0;i<b.size();i++){ 
      if(aux.get(i).contains("#")){ 
       String min=b.get(aux.get(i)).split(",")[2]; 
       String max=b.get(aux.get(i)).split(",")[1]; 
       String minVal=min.split(":")[1].replace("}","").trim(); 
       String maxVal=max.split(":")[1].trim(); 
       String c=aux.get(i).replaceFirst("#",minVal); 
       String d=c.replaceAll("#",maxVal); 
       System.out.println(d); 
       b.replace(aux1.get(i),c); 

      } 
      } 

      return b; 
     } 
} 

輸出:

Adds 40 to 20 Cold Damage to Curses 
Adds 8 to 32 Physical Damage to Weapon 
Adds 10 to 30 Fire Damage to Spells 
0

你可以試試這個

public class ChangeMapKeysWithValue { 

    public static void main(String[] args) { 

     HashMap<String, String> data=new HashMap<String, String>(); 
     HashMap<String, String> newData=new HashMap<String, String>(); 
     data.put("Chance to Avoid Fire Damage when Hit", "(3-7)%"); 
     data.put("Chance to Avoid Cold Damage when Hit", "(6-8)%"); 
     data.put("Chance to Avoid Chaos Damage when Hit", "(6-7)%"); 
     data.put("Adds # to # Fire Damage to Spells", "{\"min\":10,\"avg\":20,\"max\":30}"); 
     data.put("Adds # to # Cold Damage to Curses", "{\"avg\":20,\"max\":30,\"min\":10}"); 
     data.put("Adds # to # Cold Damage to Curses", "{\"avg\":30,\"max\":20,\"min\":40}"); 
     data.put("Adds # to # Physical Damage to Weapon", "{\"min\":8,\"max\":32,\"avg\":20}"); 
     data.put("Curse Enemies with Vulnerability on level", "30"); 

     Set<String> keySet = data.keySet(); 
     Iterator<String> itr = keySet.iterator(); 

     while(itr.hasNext()) { 

      String key = itr.next(); 
      String value = data.get(key); 

      if(key.contains("#")) { 

       String[] valueArray = value.substring(1, value.length()-1).split(","); 

       Map<String, String> valueSplitMap = new HashMap<String, String>(); 
       valueSplitMap.put(valueArray[0].split(":")[0], valueArray[0].split(":")[1]); 
       valueSplitMap.put(valueArray[1].split(":")[0], valueArray[1].split(":")[1]); 
       valueSplitMap.put(valueArray[2].split(":")[0], valueArray[2].split(":")[1]); 

       key = key.replace("#", valueSplitMap.get("\"min\"")); 
       key = key.replace("to " + valueSplitMap.get("\"min\""), "to " + valueSplitMap.get("\"max\""));       
      } 
      if(key != null && !key.isEmpty()) { 

       newData.put(key, value); 
      } 
     } 

     System.out.println(newData); 
    } 
} 
0

通常你souldn't不會改變原來的對象,所以可能是一個很好的初步實踐使用它像一個只讀對象,並在一個新的對象得到的結果,無論如何,我的實現是使用json庫java-json.jar,你可以集成到你的項目,並且你可以展示給你的教授。我相信他可以欣賞它。

下面的代碼(僅顯示的結果):

import java.util.HashMap; 

import org.json.JSONException; 
import org.json.JSONObject; 


public class Tester { 

    public Tester() { 
     // TODO Auto-generated constructor stub 
    } 

    public static String replaceAt(String s,int pos,String val) { 
     return s.substring(0, pos) + val + s.substring(pos + 1); 
     } 

    public static void main(String[] args) throws JSONException { 
     // TODO Auto-generated method stub 

     HashMap<String, String> data=new HashMap(); 
     HashMap<String, String> result=new HashMap(); 
     data.put("Chance to Avoid Fire Damage when Hit", "(3-7)%"); 
     data.put("Chance to Avoid Cold Damage when Hit", "(6-8)%"); 
     data.put("Chance to Avoid Chaos Damage when Hit", "(6-7)%"); 
     data.put("Adds # to # Fire Damage to Spells", "{\"min\":10,\"avg\":20,\"max\":30}"); 
     data.put("Adds # to # Cold Damage to Curses", "{\"avg\":20,\"max\":30,\"min\":10}"); 
     data.put("Adds # to # Cold Damage to Curses", "{\"avg\":30,\"max\":20,\"min\":40}"); 
     data.put("Adds # to # Physical Damage to Weapon", "{\"min\":8,\"max\":32,\"avg\":20}"); 
     data.put("Curse Enemies with Vulnerability on level", "30"); 

     String[] keys = data.keySet().toArray(new String[0]); 
     for (String n : keys) { 
      String value2 =""; 
      String value =""; 
      if(n.contains("#")){ 
       value = data.get(n);   
      JSONObject object = new JSONObject(value); 
      String[] valuekeys = JSONObject.getNames(object); 
      int cont =0; 
      for (String key2 : valuekeys) 
      { 
       if("min".equals(key2)){ 
        value2 =object.get(key2).toString(); 
        int pos = n.indexOf("#");    
        n=replaceAt(n, pos, value2); 
       } 
       if("max".equals(key2)){ 
         value2 =object.get(key2).toString(); 
        int pos = n.lastIndexOf("#");   
        n= replaceAt(n, pos, value2); 
       } 

      } 
      System.out.println(n); 

     } 
     } 

    } 
}