2012-05-09 20 views
11

Ho un file di proprietà Java e c'è un KEY come ORDER. Così ho recuperare il VALUE di che KEY utilizzando il metodo getProperty() dopo aver caricato il file di proprietà come di seguito .:String to HashMap JAVA

String s = prop.getProperty("ORDER"); 

poi

s ="SALES:0,SALE_PRODUCTS:1,EXPENSES:2,EXPENSES_ITEMS:3"; 

Ho bisogno di creare un HashMap dall'alto stringa. SALES,SALE_PRODUCTS,EXPENSES,EXPENSES_ITEMS dovrebbe essere KEY di HashMap e 0,1,2,3, dovrebbe essere VALUE s di KEY s.

Se si tratta di filo rigido, sembra come di seguito:

Map<String, Integer> myMap = new HashMap<String, Integer>(); 
myMap.put("SALES", 0); 
myMap.put("SALE_PRODUCTS", 1); 
myMap.put("EXPENSES", 2); 
myMap.put("EXPENSES_ITEMS", 3); 
+2

Se è veramente per il dato String, mantenere la soluzione hardcoded. .. In caso contrario, dicci cosa hai provato finora e qual è il tuo problema. – pgras

+0

http://mattgemmell.com/2008/12/08/what-have-you-tried/ –

+0

@pgras ho modificato il mio post. penso che ora non sia complicato da capire. – Bishan

risposta

34

Utilizzare il metodo String.split() con il separatore , per ottenere la lista delle coppie . Iterare le coppie e utilizzare nuovamente split() con il separatore : per ottenere la chiave e il valore per ciascuna coppia.

Map<String, Integer> myMap = new HashMap<String, Integer>(); 
String s = "SALES:0,SALE_PRODUCTS:1,EXPENSES:2,EXPENSES_ITEMS:3"; 
String[] pairs = s.split(","); 
for (int i=0;i<pairs.length;i++) { 
    String pair = pairs[i]; 
    String[] keyValue = pair.split(":"); 
    myMap.put(keyValue[0], Integer.valueOf(keyValue[1])); 
} 
+2

utilizzando un foreach è possibile salvare una riga! :) – Ayoub

+0

il collegamento al metodo String.split() è rotto – inquisitive

50

È possibile farlo con Guava'sSplitter.MapSplitter:

Map<String, String> properties = Splitter.on(",").withKeyValueSeparator(":").split(inputString); 
+5

+1 per avermi fatto scoprire una nuova cosa in Guava! – pgras

+1

Si prega di notare che questo restituisce un elenco immutabile – xilef

+1

@xilef e questa è la parte migliore di esso! –

2

Supponendo che nessuna chiave contiene sia ',' o ':':

Map<String, Integer> map = new HashMap<String, Integer>(); 
for(final String entry : s.split(",")) { 
    final String[] parts = entry.split(":"); 
    assert(parts.length == 2) : "Invalid entry: " + entry; 
    map.put(parts[0], new Integer(parts[1])); 
} 
1

È possibile usare diviso per farlo:

String[] elements = s.split(","); 
for(String s1: elements) { 
    String[] keyValue = s1.split(":"); 
    myMap.put(keyValue[0], keyValue[1]); 
} 

Tuttavia, io andrò per soluzione guava base. https://stackoverflow.com/a/10514513/1356883

0

provare

String s = "SALES:0,SALE_PRODUCTS:1,EXPENSES:2,EXPENSES_ITEMS:3"; 
    HashMap<String,Integer> hm =new HashMap<String,Integer>(); 
    for(String s1:s.split(",")){ 
     String[] s2 = s1.split(":"); 
     hm.put(s2[0], Integer.parseInt(s2[1])); 
    } 
2

Usa StringTokenizer per analizzare la stringa.

String s ="SALES:0,SALE_PRODUCTS:1,EXPENSES:2,EXPENSES_ITEMS:3"; 
    Map<String, Integer> lMap=new HashMap<String, Integer>(); 


    StringTokenizer st=new StringTokenizer(s, ","); 
    while(st.hasMoreTokens()) 
    { 
     String [] array=st.nextToken().split(":"); 
     lMap.put(array[0], Integer.valueOf(array[1])); 
    } 
0

È anche possibile utilizzare la classe JSONObject da json.org a questo convertirà il tuo HashMap a stringa JSON che è ben formattato

Esempio:

Map<String,Object> map = new HashMap<>(); 
map.put("myNumber", 100); 
map.put("myString", "String"); 

JSONObject json= new JSONObject(map); 

String result= json.toString(); 

System.out.print(result); 

risultato:

{'myNumber':100, 'myString':'String'} 

Il tuo può anche ottenere la chiave da essa come

System.out.print(json.get("myNumber")); 

risultato:

100 
11

In una linea:

HashMap<String, Integer> map = (HashMap<String, Integer>) Arrays.asList(str.split(",")).stream().map(s -> s.split(":")).collect(Collectors.toMap(e -> e[0], e -> Integer.parseInt(e[1]))); 

Particolari:

1) coppie di voce dividere e convertire matrice di stringhe List<String> al fine di utilizzare java.lang.Collection.Stream API da Java 1.8

Arrays.asList(str.split(",")) 

2) Mappare lo strin risultante g elenco "key:value" ad una matrice di stringhe con [0] come chiave e [1] come valore

map(s -> s.split(":")) 

3) Utilizzare collect metodo terminale dal flusso API di mutare

collect(Collector<? super String, Object, Map<Object, Object>> collector) 

4) Utilizzare il Collectors.toMap() statico metodo che utilizza due funzioni per eseguire la mutazione dal tipo di input al tipo di chiave e valore.

toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper) 

dove T è il tipo di input, K il tipo di chiave e U il tipo di valore.

5) A seguito di lambda mutare String-String chiave e String-Integer valore

toMap(e -> e[0], e -> Integer.parseInt(e[1])) 



godere lo stile torrente e lambda con Java 8.Niente più loop!

+1

Posso essere contrassegnato ma devo dire, santo cielo! Non ho mai saputo che Java fosse così potente. – WeirdElfB0y

+2

Questa "linea" darà l'incubo ai futuri manutentori –

0
String mapString=hasmap.toString(); 

Pattern p = Pattern.compile("[\\{\\}\\=\\, ]++"); 

String[] split = p.split(mapString); 

per maggiori info clicca here

0

Mi consiglia di utilizzare com.fasterxml.jackson.databind.ObjectMapper (link repo Maven: https://mvnrepository.com/artifact/com.fasterxml.jackson.core) come

final ObjectMapper mapper = new ObjectMapper(); 
Map<String, Object> mapFromString = new HashMap<>(); 
try { 
    mapFromString = mapper.readValue(theStringToParse, new TypeReference<Map<String, Object>>() { 
     }); 
} catch (IOException e) { 
    LOG.error("Exception launched while trying to parse String to Map.", e); 
}