是否有一个字符串来映射谷歌收藏中的分割器

osh*_*hai 6 java string map guava

我正在寻找谷歌收藏中地图木匠的反面.有这样的东西,如果不是为什么?

编辑:这是一个我希望如何的例子:

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

编辑:我打开了一个请求,它已经实现.将在番石榴R10中提供.

Sea*_*oyd 5

这是一个Maps2提供方法的类

Map<String, String> mapSequence(String)
Run Code Online (Sandbox Code Playgroud)

它还提供了两个重载方法,您可以在这些方法中更改在键和值之间使用的分隔符(默认值:) =和b)在条目之间(默认值:) ,.Guava类喜欢SplitterIterables内部用于完成工作.返回的地图是a 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

测试代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

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


sly*_*7_7 2

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

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);
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,[这已添加到 Guava v10](http://code.google.com/p/guava-libraries/issues/detail?id=467&amp;can=1&amp;q=milestone%3DRelease10%20status%3DFixed&amp;sort=id% 20-owner&amp;colspec=ID%20Type%20Status%20Milestone%20Summary)。 (2认同)