代码之家  ›  专栏  ›  技术社区  ›  Avinash

通过拆分字符串创建地图列表

  •  0
  • Avinash  · 技术社区  · 3 年前

    我有一个字符串,它的值可以是 Insert , Insert&Update Update 现在,基于这个值,我必须创建一个 Map 如下所示。

    案例1:何时 myString="Insert" ,我需要这样的输出

    "Database": [
                    {
                        "Action": "Insert"
                    }
                ]
    

    案例2:何时 myString="Insert&Update" ,我需要这样的输出

    "Database": [
                    {
                        "Action": "Insert"
                    },
                    {
                        "Action": "Update"
                    }
                ]
    

    案例1:何时 myString="Update" ,我需要这样的输出

    "Database": [
                    {
                        "Action": "Update"
                    }
                ]
    

    我是java新手,根据我的知识,我目前正在手动检查条件并手动创建列表(如下所示)。有什么办法可以分开吗 myString 并自动创建此列表?

    Map<String, String> database = new HashMap<String, String>();
    List<Map<String, String>> subList = new ArrayList<>();              
    if(myString.equals("Insert")){              
        database.put("Action", "Insert");
        subList.add(database);
    } else if(myString.equals("Insert&Update")){
        database.put("Action", "Insert");
        subList.add(database);
        database = new HashMap<String, String>();
        database.put("Action", "Update");
        subList.add(database);
    } else {
        ....
    }
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   DwB    3 年前

    停止更努力地工作,开始更聪明地工作

    执行以下操作:

    1. 分析需求。 经分析, 这一点变得很清楚:您正在实现FizzBuzz的变体。
    2. 实施适当的解决方案。

    如果你不认识这个引用,请在谷歌上搜索“FizzBuzz”。

    以下是您问题的解决方案:

    1. 接收字符串作为输入。
    2. 如果输入包含单词“插入”, 在输出映射中添加插入条目。
    3. 如果输入包含单词“更新”, 向输出映射添加更新条目。
    4. 返回输出映射。
        2
  •  1
  •   rudolfovic    3 年前

    是的,你可以使用 myString.split("&") 以获得一系列操作。然后,您可以迭代它并生成所有操作:

    List<Map<String, String>> actions = new LinkedList<>();
    String[] strings = myString.split("&");
    for (String s : strings) {
      actions.add(action(s));
    }
    

    使用此辅助函数生成动作字典:

    Map<String, String> action(String action) {
      Map<String, String> map = new HashMap<>();
      map.put("Action", action);
      return map;
    }
    

    只要记住,如果有人屈服 myString=Messing&With&You 与原始代码不同,此代码不会验证输入。所以你可以把你的 put 在A if :

    if (s.equals("Insert") || s.equals("Update")) {
      actions.add(action(s));
    }
    

    如果您的输入无效,您可能还想抛出异常:

    if (actions.size() != strings.length) {
      throw new Exception("Inputs invalid");
    }
    

    把一切放在一起:

    Map<String, String> action(String action) {
      Map<String, String> map = new HashMap<>();
      map.put("Action", action);
      return map;
    }
    
    void handle(String myString) {
      List<Map<String, String>> actions = new LinkedList<>();
      String[] strings = myString.split("&");
      for (String s : strings) {
        if (s.equals("Insert") || s.equals("Update")) {
          actions.add(action(s));
        }
      }
      if (actions.size() != strings.length) {
        throw new Exception("Inputs invalid");
      }
    }
    
        3
  •  1
  •   Eritrean    3 年前

    只要你的字符串只有三个可能值中的一个(否则添加一个过滤器),你就可以很容易地做到这一点,如下所示

    String myString = ... ;
        
    List<Map<String, String>> subList = Arrays.stream(myString.split("&"))
                                              .map(str -> Collections.singletonMap("Action", str))
                                              .collect(Collectors.toList());