【问题标题】:Replace String values with value in Hash Map用哈希映射中的值替换字符串值
【发布时间】:2013-09-03 20:35:02
【问题描述】:

我是 Java 编程新手。我创建了一个包含我的键值对的哈希映射,用于将用户输入替换为对应于相应键的值。

        HashMap<String,String> questionKey = new HashMap<>();             

         for (item : itemSet()) {
             questionKey.put(String.valueOf(item.getOrder()+1), item.getKey());                                
         }                    
        String list = commandObject.getObjectItem().getList();

        if (list.contains("q")){                
            list.replaceAll("q01", questionKey.get("1"));               
            commandObject.getObjectItem().setList(list);
        }             

我在公式评估中使用它

注意:给用户一定的公式特定的输入方式(value1 + value2 + value3)

我将 (value1 value2 value3) 转换为 (value1key value2key value3key)

更新:

我现在更好理解的问题旨在帮助更好地了解如何利用哈希图来评估用户输入。更明确的问题是

评估表达式的最佳方法是什么,即

用户输入 = "var1 + var2"

期望值:valueOf(var1) + valueOf(var2)

?

【问题讨论】:

  • 问题/问题是什么?
  • 您的代码甚至无法远程编译。甚至不确定您要达到的目标是否可以理解。请提供可编译的代码、堆栈跟踪(如果有)和更清晰的范围。
  • 问题是..?
  • @SJuan76 澄清这是一个 Spring 应用程序,我试图在表单提交到数据库时将用户的输入替换为相应的 keyValue 作为以后公式计算的参考。跨度>
  • @Mena 如果有帮助,我可以发布带有更多详细信息的伪代码。

标签: java replace hashmap


【解决方案1】:
@Test
public void testSomething() {
    String str = "Hello ${myKey1}, welcome to Stack Overflow. Have a nice ${myKey2}";
    Map<String, String> map = new HashMap<String, String>();
    map.put("myKey1", "DD84");
    map.put("myKey2", "day");
    for (Map.Entry<String, String> entry : map.entrySet()) {
        str = str.replace("${" + entry.getKey() + "}", entry.getValue());
    }
    System.out.println(str);        
}

输出:

您好 DD84,欢迎来到 Stack Overflow。祝你有美好的一天

对于更复杂的事情,我宁愿使用OGNL

【讨论】:

  • 我害怕在论坛或这个网站上提问,因为即使是初学者,我收到的也只是嘲笑。我和其他人一样努力学习。 @AlfredoOsorio 感谢您的回答,但出于讽刺的性质,我选择不接受它作为我的回答。
  • @DD84 只是一个友好的建议,这里重要的是学习。我不认为讽刺应该以任何方式在这里生效。暂时接受它,然后也许几个月后回答阿尔弗雷多的一些问题。 :)
  • @JNL 感谢您的建议。我会考虑到这一点。
【解决方案2】:
import java.util.HashMap;

class Program
{
    public static void main(String[] args)
    {
        String pattern = "Q01 + Q02";
        String result = "";

        HashMap<String, String> vals = new HashMap<>();

        vals.put("Q01", "123");
        vals.put("Q02", "123");

        for(HashMap.Entry<String, String> val : vals.entrySet())
        {
            result = pattern.replace(val.getKey(), val.getValue());
            pattern = result;
        }

        System.out.println(result);

    }
}

【讨论】:

  • result变量中使用StringBuilder效率更高。记住String 是不可变的。
  • 遍历字符串比遍历地图更有效。字符串可能很短,地图可能包含数百万个条目。
【解决方案3】:

Java 8 揭示了这个post 中给出的函数式方法。
您只是为地图中的每个单词创建一个新函数并将它们链接在一起。 例如:

public static void main(String[] args) {
    Map<String, String> dictionary = new HashMap<>();
    String stringToTranslate = "key1 key2"
    dictionary.put("key1", "value1");
    dictionary.put("key2", "value2");
    String translation = dictionary.entrySet().stream()
        .map(entryToReplace -> (Function<String, String>) s -> s.replace(entryToReplace.getKey(), 
             s.replace(entryToReplace.getValue())
        .reduce(Function.identity(), Function::andThen)
        .apply(stringToTranslate);
}

【讨论】:

  • 遍历字符串比遍历地图更有效。字符串可能很短,地图可能包含数百万个条目。
  • 哦编译错误。我认为您应该将行 .map(entryToReplace -&gt; (Function&lt;String, String&gt;) s -&gt; s.replace(entryToReplace.getKey(), s.replace(entryToReplace.getValue()) 修复为 .map(entryToReplace -&gt; (Function&lt;String, String&gt;) s -&gt; s.replace(entryToReplace.getKey(), entryToReplace.getValue()))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多