Вот класс Maps2
, который предоставляет метод
Map<String, String> mapSequence(String)
Он также предоставляет два перегруженных метода, в которых вы можете изменять используемые разделители а) между ключами и значениями (по умолчанию: =
)и б) между записями (по умолчанию: ,
).Классы гуавы, такие как Splitter
и Iterables
, используются внутри для выполнения работы.Возвращаемая карта - 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 =}