2017-06-26 46 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); 

     } 
     } 

    } 
}