为了账号安全,请及时绑定邮箱和手机立即绑定

在复杂的 HashMap 中使用 StringJoiner

在复杂的 HashMap 中使用 StringJoiner

精慕HU 2022-11-30 14:23:53
我有一个地图列表如下:List<Map<String,Object>> someObjectsList = new ArrayList<Map<String,Object>>();我在每个 HashMap 中存储以下数据key             value2017-07-21      2017-07-21-07.33.28.4293402017-07-24      2017-07-24-01.23.33.5913402017-07-24      2017-07-24-01.23.33.4923402017-07-21      2017-07-21-07.33.28.429540我想遍历HashMaps 的列表并检查键是否与任何HashMap值的前 10 个字符匹配,然后我想以以下格式存储这些键和值。即通过使用遥测“逗号”。最终目的是将 HashMap 的唯一键及其相对值(如果键与任何HashMap值的前 10 个字符匹配)分组到一个新的 HashMap 中。key          value2017-07-21  2017-07-21-07.33.28.429340,2017-07-21-07.33.28.4295402017-07-24  2017-07-24-01.23.33.591340,2017-07-24-01.23.33.492340我正在尝试使用以下 java 代码StringJoiner,但没有得到预期的结果。关于如何在这里构建逻辑的任何线索?import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringJoiner;public class SampleOne {    public static void main(String[] args) {        // TODO Auto-generated method stub        List<Map<String, Object>> someObjectsList = new ArrayList<Map<String, Object>>();        Map<String, Object> mapOne = new HashMap<String, Object>();        mapOne.put("2017-07-21", "2017-07-21-07.33.28.429340");        Map<String, Object> mapTwo = new HashMap<String, Object>();        mapTwo.put("2017-07-24", "2017-07-24-01.23.33.591340");        Map<String, Object> mapThree = new HashMap<String, Object>();        mapThree.put("2017-07-24", "2017-07-24-01.23.33.492340");        Map<String, Object> mapFour = new HashMap<String, Object>();        mapFour.put("2017-07-21", "2017-07-21-07.33.28.429540");        someObjectsList.add(mapOne);        someObjectsList.add(mapTwo);        someObjectsList.add(mapThree);        someObjectsList.add(mapFour);
查看完整描述

4 回答

?
慕田峪9158850

TA贡献1794条经验 获得超8个赞

使用.merge函数:


Map<String, Object> finalMap = new HashMap<String, Object>();


for (Map map : someObjectsList) {

    for (Object key : map.keySet()) {

        String value = ((String) map.get(key));

        finalMap.merge((String) key, value, (k, v) -> k + "," + v);

    }

}

输出:


{2017-07-21=2017-07-21-07.33.28.429340,2017-07-21-07.33.28.429540, 2017-07-24=2017-07-24-01.23.33.591340,2017-07-24-01.23.33.492340}


同样可以通过以下一行实现:


someObjectsList.stream()

               .flatMap(i -> i.entrySet().stream())

               .collect(Collectors.toMap(Entry::getKey, Entry::getValue, 

                                        (k, v) -> k + "," + v));


查看完整回答
反对 回复 2022-11-30
?
慕沐林林

TA贡献2016条经验 获得超9个赞

你有什么理由Object过度使用String并避免安全检查?也就是说,它不是“前 10 个字符”,你想看看是否value以key句号开头(你所有的键都是 10 个字符)。所以在那种情况下你可以这样做if (value.startsWith(key)) { ... }。如果 stringjoiner 未满,请不要忘记您的换行符。最后,您不需要 a List, aMap可以一次容纳多个密钥。另一种方法:


//LinkedHashMap will preserve our insertion order

Map<String, String> map = new LinkedHashMap<>();

map.put("2017-07-21", "2017-07-21-07.33.28.429340");

map.put("2017-07-24", "2017-07-24-01.23.33.591340");

//note duplicates are overwritten, but no value change here

map.put("2017-07-24", "2017-07-24-01.23.33.492340");

map.put("2017-07-21", "2017-07-21-07.33.28.429540");

//  You can also use Java 8 streams for the concatenation

//  but I left it simple

List<String> matches = map.entrySet()

        .filter(e -> e.getValue().startsWith(e.getKey())

        .collect(Collectors.toList());

String concatenated = String.join("\n", matches);

如果你想生成没有流的字符串,它看起来像这样(同样,#entrySet为了简单起见不使用,但在这里会更有效率):


List<String> matches = new ArrayList<>();

StringJoiner joiner = new StringJoiner("\n");

for (String key : map.keySet()) {

    String value = map.get(key);

    if (value.startsWith(key)) {

        joiner.add(value);

    }

}

//joiner#toString will give the expected result


查看完整回答
反对 回复 2022-11-30
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

您正在寻找处理 a 的分组行为List。你可以利用的优势java流自从Java-8. 在任何情况下,您都需要一个新Map的来存储值以便打印它们。:


someObjectsList.stream()

        .flatMap(i -> i.entrySet().stream())               // flatmapping to entries

        .collect(Collectors.groupingBy(Entry::getKey))     // grouping them using the key

如果您想使用 for 循环。在这种情况下,它会更难,因为每个列表项中可能会出现更多条目:


final Map<String, List<Object>> map = new HashMap<>();

for (Map<String, Object> m: someObjectsList) {          // iterate List<Map>

    for (Entry<String, Object> entry: m.entrySet()) {   // iterate entries of each Map

        List<Object> list;

        final String key = entry.getKey();              // key of the entry

        final Object value = entry.getValue();          // value of the entry

        if (map.containsKey(key)) {                     // if the key exists

            list = map.get(key);                        // ... use it

        } else {

            list = new ArrayList<>();                   // ... or else create a new one

        }

        list.add(value);                                // add the new value

        map.put(key, list);                             // and add/update the entry

    }

}

在这两种情况下打印出来Map<String, List<Object>> map将产生以下输出:


2017-07-21=[2017-07-21-07.33.28.429340, 2017-07-21-07.33.28.429540], 

2017-07-24=[2017-07-24-01.23.33.591340, 2017-07-24-01.23.33.492340]


查看完整回答
反对 回复 2022-11-30
?
繁花如伊

TA贡献2012条经验 获得超12个赞

在您的代码中,您在每张地图上使用不同的 StringJoiner。因此,它正在创建它的一个新实例。


您可以将钥匙保存在地图上。示例代码:(编辑:我没有删除您的 StringJoiner 部分。)


public static void main(String[] args) {

        // TODO Auto-generated method stub

        List<Map<String, Object>> someObjectsList = new ArrayList<Map<String, Object>>();


        Map<String, Object> mapOne = new HashMap<String, Object>();

        mapOne.put("2017-07-21", "2017-07-21-07.33.28.429340");


        Map<String, Object> mapTwo = new HashMap<String, Object>();

        mapTwo.put("2017-07-24", "2017-07-24-01.23.33.591340");


        Map<String, Object> mapThree = new HashMap<String, Object>();

        mapThree.put("2017-07-24", "2017-07-24-01.23.33.492340");


        Map<String, Object> mapFour = new HashMap<String, Object>();

        mapFour.put("2017-07-21", "2017-07-21-07.33.28.429540");


        someObjectsList.add(mapOne);

        someObjectsList.add(mapTwo);

        someObjectsList.add(mapThree);

        someObjectsList.add(mapFour);


        Map<String, Object> outputMap = new HashMap<String, Object>();


        for (Map map : someObjectsList) {

            StringJoiner sj = new StringJoiner(",");

            for (Object key : map.keySet()) {

                String value = ((String) map.get(key));

                String date = value.substring(0, Math.min(value.length(), 10));

                //System.out.println(str);

                //System.out.println(value);


                if(key.equals(date)) {

                    sj.add(value);

                    System.out.println(sj.toString());

                    if(outputMap.containsKey(key)) {

                        String str = (String) map.get(key);

                        str = str + "," + value;

                        outputMap.put((String)key, str);

                    } else {

                        outputMap.put((String)key, value);

                    }

                }

            }

        }


        for (String map : outputMap.keySet()) {

             System.out.println(map + " " + outputMap.get(map));

        }

    }


查看完整回答
反对 回复 2022-11-30
  • 4 回答
  • 0 关注
  • 241 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号