有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在google集合中有一个字符串映射拆分器吗

我正在寻找谷歌收藏中地图加入者的反面。有这样的事情吗?如果没有,为什么

编辑: 下面是一个我希望的例子:

Map<String,String> myMap = Splitter.on(",").keyValueSeparator("=").split("k1=v1,k2=v2");

编辑: 我打开了一个request并实现了它。将提供番石榴R10


共 (5) 个答案

  1. # 1 楼答案

    你自己动手做很简单:

    // assumes that input is properly formed e.g. "k1=v1,k2=v2"
    public Map<String, String> toMap(String input) {
        Map<String, String> map = new HashMap<String, String>();
        String[] array = input.split(",");
        for (String str : array) {
            String[] pair = str.split("=");
            map.put(pair[0], pair[1]);
        }
        return map;
    }
    
  2. # 2 楼答案

    不是番石榴

    但是StringToMap可以帮你

  3. # 3 楼答案

    我认为番石榴没有这样的特点。 对我来说,原因是条目字符串可以有多种格式,因此您必须为自己的格式创建自己的“解析器”。 如果您可以修改输入字符串的格式,另一个(丑陋的)选择可能是:

    final String toSplit = "k1=v1" + getProperty("line.separator") + "k2=v2";
    final Properties properties = new Properties();
    properties.load(new ByteArrayInputStream(toSplit.getBytes(Charsets.UTF_8)));
    Maps.fromProperties(properties);
    
  4. # 4 楼答案

    这里有一个类Maps2提供了一个方法

    Map<String, String> mapSequence(String)
    

    它还提供了两个重载方法,您可以在其中更改a)键和值之间(默认值:=)和b)条目之间(默认值:,)使用的分隔符。像SplitterIterables这样的番石榴类在内部用于完成这项工作。返回的映射是LinkedHashMap,因此条目顺序被保留

    public final class Maps2{
    
        public static final String DEFAULT_ENTRY_DELIMITER = ",";
        public static final String DEFAULT_KEYVALUE_DELIMITER = "=";
    
        private Maps2(){}
    
        public static Map<String, String> mapSequence(final String sequence){
            return mapSequence(sequence, DEFAULT_KEYVALUE_DELIMITER);
        }
    
        public static Map<String, String> mapSequence(final String sequence,
            final String keyValueDelim){
            return mapSequence(sequence, keyValueDelim, DEFAULT_ENTRY_DELIMITER);
        }
    
        public static Map<String, String> mapSequence(final String sequence,
            final String keyValueDelim, final String entryDelim){
    
            final Splitter entrySplitter =    Splitter.on(entryDelim)
                                                      .trimResults();
            final Splitter keyValueSplitter = Splitter.on(keyValueDelim)
                                                      .trimResults();
            final Map<String, String> map = Maps.newLinkedHashMap();
            for(final String token : entrySplitter.split(sequence)){
                final String[] items =
                    Iterables.newArray(
                        keyValueSplitter.split(token), String.class);
                if(items.length != 2){
                    throw new IllegalArgumentException(
                       "Map String not well-formed");
                }
                map.put(items[0], items[1]);
            }
            return map;
        }
    
    }
    

    测试代码:

    public static void main(final String[] args){
        // note the randomly spread whitespace in the test code,
        // also the last entry has no value.
        // using Splitter().trimResults() we can handle junk like that
        final Map<String, String> map = Maps2.mapSequence("k1=v1 ,k2=v2, k3 =");
        System.out.println(map);
    }
    

    输出:

    {k1=v1, k2=v2, k3=}

  5. # 5 楼答案

    当然,你可以用番石榴:

    String queryParamStr = "key1=value1&key2=value2";
    Splitter.on('&').trimResults().withKeyValueSeparator('=').split(queryParamStr);