簡體   English   中英

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

[英]is there a string to map splitter in google collections

我正在尋找谷歌收藏中地圖木匠的反面。 有這樣的東西,如果不是為什么?

編輯:這是一個我希望如何的例子:

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

編輯:我打開了一個請求 ,它已經實現。 將在番石榴R10中提供。

這是一個提供方法的Maps2

Map<String, String> mapSequence(String)

它還提供了兩個重載方法,您可以在這些方法中更改在鍵和值之間使用的分隔符(默認值: = )和b)在條目之間(默認值: , )。 SplitterIterables這樣的Guava類在內部用於完成工作。 返回的地圖是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 =}

我認為番石榴沒有這樣的特征。 對我來說,原因是條目String可以有多種格式,因此您必須為自己的格式創建自己的“解析器”。 如果您可以修改條目字符串的格式,那么(丑陋)替代方案可能是這個:

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);

滾動自己是非常簡單的:

// 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;
}

不是番石榴。

但是StringToMap可以為你做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM