【问题标题】:Java Map Values to Comma Separated StringJava 将值映射到逗号分隔的字符串
【发布时间】:2014-01-14 07:05:21
【问题描述】:

有没有一种有效的方法可以使用 guava 或 StringUtils 将 java 映射值转换为逗号分隔的字符串?

Map<String, String> testMap = new HashMap<>();
testMap.put("key1", "val1");
testMap.put("key2", "val2");

寻找将 testMap 转换为字符串的方法 -> "val1,val2"。

【问题讨论】:

  • 你的意思是像"map: " + map 那样吗?
  • “逗号分隔的字符串”是什么意思?
  • 您可以为您的输入和输出添加示例吗?
  • 这只是供人类阅读,还是您以后可以通过某些软件读回来?如果是后者,请考虑如果其中一个值中有逗号会发生什么。您可能希望使用已建立的序列化格式,例如 JSON。
  • 我们回答了您的问题吗?是这样,请选择一个答案并将其标记为已接受。

标签: java csv map guava string-utils


【解决方案1】:

以下是在 Java 8+ 中的操作方法(不需要 Guava、StringUtils 或其他外部库):

testMap.values().stream().map(Object::toString).collect(Collectors.joining(","));

【讨论】:

  • 在 Java 8 中只需使用 String.join(",", testMap.values()) 就像在 Syam's answer 中一样。
  • 是的,这样更干净。每个人都应该支持 Syam 的回答
  • 这在您处理更复杂的对象时很有用,例如:symbols TreeMap ... symbols.entrySet().stream().filter(x -&gt; x.getValue().myParameter.size() &gt; 0).map(Map.Entry::getKey).collect(Collectors.toList())));
【解决方案2】:

番石榴:Joiner.on(',').join(map.values()).

【讨论】:

    【解决方案3】:

    在 Java 1.8 中,join() 方法被添加到可以执行此操作的 String 类中。

    Map 也有一个函数values() 来获取所有值。 map.values() 是字符串类型,所以只需传递给 String.join。示例:

    Map<String, String> testMap = new HashMap<>();
    testMap.put("key1", "val1");
    testMap.put("key2", "val2");
    
    String valueString = String.join(",",map.values()); //val1,val2
    

    【讨论】:

    • 方法可用 String.join 可从 JDK 1.8 开始
    【解决方案4】:

    你可以使用StringUtils:

    final Map<String, String> testMap = new LinkedHashMap<String, String>();
    testMap.put("key1", "val1");
    testMap.put("key2", "val2");
    
    String csv = StringUtils.join(testMap.values(), ',')); // "val1,val2"
    

    请注意,我将 HashMap 更改为 LinkedHashMap,以保持插入顺序。

    【讨论】:

      【解决方案5】:

      好的,这是我的猜测,以防你想要这样的东西(你的问题中没有澄清)。这是在没有 Guava 或 StringUtils 的情况下完成的:

      Map<Integer, Integer> map = new HashMap<Integer, Integer>();
      
      map.put(1, 2);
      map.put(3, 4);
      
      System.out.println(map.toString());
      

      输出:

      {1=2, 3=4}
      

      如果您想将values 显示为逗号分隔列表,您可以使用:

      System.out.println(map.values().toString());
      

      输出:

      [2, 4]
      

      PS:如果你愿意,可以用.replaceAll() 删除[]s

      【讨论】:

      • 或者只是值:System.out.println (map.values());
      • 或者只是钥匙! :-) System.out.println(map.keySet());
      【解决方案6】:

      您可以在Eclipse Collections 中使用makeString()

      MutableMap<String, String> testMap = new UnifiedMap<String, String>();
      testMap.put("key1", "val1");
      testMap.put("key2", "val2");
      
      String commaAndSpace = testMap.makeString();
      Assert.assertTrue(commaAndSpace.equals("val1, val2")
        || commaAndSpace.equals("val2, val1"));
      
      String comma = testMap.makeString(",");
      Assert.assertTrue(comma.equals("val1,val2")
        || comma.equals("val2,val1"));
      

      如果您无法将 Map 转换为 Eclipse Collections 类型,则可以使用 MapAdapter

      MapAdapter.adapt(testMap).makeString();
      

      注意:我是 Eclipse 集合的提交者。

      【讨论】:

      • @Donald Raab,如果 MutableMap#makeString 的方法名称类似于 makeKeyString 用于字符串值的键,makeValueString 用于字符串值的值,我会很棒。方法名makeString不是更自我描述的了
      • 伟大的观察。如果您有兴趣贡献,这些可能是对图书馆的潜在贡献。 map 上的makeString 方法实际上继承自RichIterable。在 Eclipse Collections 中,MutableMap&lt;K, V&gt; 扩展了 RichIterable&lt;V&gt;
      【解决方案7】:

      如果您使用的是 Spring MVC,那么这可能对您有用。

      import org.springframework.util.StringUtils;
      
      Map<String, String> groups = //List of Maps
      List<String> targetList = new ArrayList<String>(groups).values());
      String csv = StringUtils.arrayToCommaDelimitedString(targetList.toArray());
      

      输出:abc,def,ghi

      【讨论】:

        猜你喜欢
        • 2018-03-01
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        相关资源
        最近更新 更多