2010-11-04 26 views
6

Tôi đang tìm kiếm đối diện của bản đồ joiner trong bộ sưu tập google. có cái gì đó như thế này, và nếu không phải lý do tại sao?là có một chuỗi để bản đồ splitter trong bộ sưu tập google

EDIT: đây là một ví dụ làm thế nào tôi muốn nó sẽ là:

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

EDIT: Tôi mở một request và nó được thực hiện. sẽ có sẵn trong ổi R10.

+0

Bạn có nghĩa là để phân tích một chuỗi vào một bản đồ? Và vui lòng thêm thẻ ổi –

Trả lời

2

Tôi nghĩ không có tính năng nào trong ổi. Đối với tôi lý do là chuỗi mục nhập có thể có nhiều định dạng, do đó bạn phải tạo "trình phân tích cú pháp" của riêng mình cho định dạng của riêng bạn. An (xấu xí) thay thế có thể là thế này, nếu bạn có thể thay đổi định dạng của chuỗi nhập của bạn:

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

nhưng vấn đề phân tích cú pháp đã được nhắm mục tiêu bởi bộ tách – oshai

+0

Có, nhưng bộ tách không phải là SplitterAndMapMaker. Với "keyValueSeparator" của bạn, nó không phải là một Splitter nữa. Dù sao, bạn có thể gửi một yêu cầu trên http://code.google.com/p/guava-libraries/issues/list và chờ đợi câu trả lời cho người guava. –

+0

+1 cho liên kết – oshai

1

Nó khá tầm thường cuộn của riêng bạn:

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

Dưới đây là một lớp Maps2 cung cấp một phương pháp

Map<String, String> mapSequence(String) 

Nó cũng cung cấp hai phương pháp quá tải, nơi bạn có thể thay đổi delimiters được sử dụng a) giữa các phím và các giá trị (mặc định: =) và b) giữa các mục (mặc định: ,). Các lớp ổi như SplitterIterables được sử dụng nội bộ để thực hiện công việc. Bản đồ được trả lại là LinkedHashMap, vì vậy, thứ tự nhập được giữ nguyên.

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

} 

mã kiểm tra:

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

Output:

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

+0

& @Peter Knego - hai giải pháp của bạn không cho phép giá trị có dấu bằng (ví dụ: "k1 = v1 = s, k2 = v2"). thay vì sử dụng bộ chia thứ hai, bạn nên sử dụng hàm String.split với giới hạn arg token.split (keyValueDelim, 2); (BTW: Tôi không cho phép giá trị bằng dấu phẩy :)) – ekeren

+1

Tôi không đồng ý, dẫn đến kết quả không thể đoán trước và không đáng tin cậy (nếu cái = trong khóa, không phải là giá trị?). Tôi nghĩ tốt hơn là thất bại nhanh chóng, và không: một hàm đơn giản như thế này không thể ánh xạ các chuỗi rất phức tạp. Sử dụng JSON nếu bạn muốn phức tạp hơn. –

+0

bạn dễ dàng thuyết phục tôi – ekeren

Các vấn đề liên quan