2013-07-09 83 views
8

反對我有不使用分割法在這個格式的字符串(從EBS支付網關響應)如何結合的字符串在Java

key1=value1&key2=value2&key3=value3 

如何結合這個類對象?

public class MyClass { 

    private String key1; 
    private String key2; 
    private String key3; 
    // getter and setter methods 
    ... 
} 
+0

您的課程是否需要存儲密鑰或密鑰值? – Pshemo

+0

@vivek,如果你不想使用拆分,檢查我的答案(使用正則表達式)。 –

+2

只是想知道什麼可以不使用拆分的原因?這是一項任務嗎? –

回答

3
String template = "key1=value1&key2=value2&key3=value3"; 
String pattern = "&?([^&]+)="; 

Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(template); 

while (m.find()) 
{ 
    System.out.println(m.group(1)); //prints capture group number 1 
} 

輸出:

key1 
    key2 
    key3 

當然,這可以被簡化爲:

Matcher m = Pattern.compile("&?([^&]+)=").matcher("key1=value1&key2=value2&key3=value3"); 

while (m.find()) 
{ 
    System.out.println(m.group(1)); //prints capture group number 1 
} 

擊穿:

"&?([^&]+)="; 

&?:表示0或1 &
[^&]+匹配1個或多個字符不等於&
([^&]+)捕獲上述字符(允許你提取它們)
&?([^&]+)=捕獲上述字符,使得它們開始0或1 &=

NB結束:即使我們不排除在[^&]=,這種表達的作品,因爲如果它可以在它的=標誌匹配任何,該字符串也有一個「&',因此[^&=]是不必要的。

+0

如果你不熟悉正則表達式,爲了編譯它,'Pattern'和'Matcher'來自'java.util .regex'。 –

2

將你的字符串分成幾部分,然後使用你的setters來設置它們。

String str = "key1=value1&key2=value2&key3=value3"; 
String[] split = str.split("&"); 

MyClass obj = new MyClass(); 

obj.setKey1(split[0].split("=")[1]); 
obj.setKey2(split[1].split("=")[1]); 
obj.setKey3(split[2].split("=")[1]); 

第一個分割,將字符串拆分爲&符號。

鍵1 =值[0]

鍵2 =值[1]

KEY3 =值[2]

在此之後,拆分各個那些對=符號

key1 [0] [0]

值1 [0] [1]

KEY2 [1] [0]

值2 [1] [1]

KEY3 [2] [0]

值3 [2] [1]

因此,在第一個代碼塊,你有split[0].split("=")[1]這是[0][1]在下面的解釋。這是value1

它的快速&骯髒的,但它工作完全正常:)

+0

沒有使用拆分方法沒有其他方法 – vivek

+0

@vivek如果你真的想避免拆分方法,你可以使用'StringTokenizer'。 http://www.mkyong.com/java/java-stringtokenizer-example/ – JREN

+1

@vivek,是的,有。看到我的答案。 –

6

嘗試以下

public class MyClass { 

    private String key1; 
    private String key2; 
    private String key2; 

    public MyClass(String k1,String k2,String k3) 
    { 
     Key1 = k1; 
     Key2 = k2; 
     Key3 = k3; 
    } 
// getter and setter methods 
... 
} 

雖然創建類的對象

String response = "key1=value1&key2=value2&key3=value3"; 
String[] keys = response.split("&"); 
MyClass m = new MyClass(keys[0].split("=")[1],keys[1].split("=")[1],keys[2].split("=")[1]) 
+0

這基本上就是我說的,只是難以閱讀。 – JREN

+0

是的。爲了使它更具可讀性,我花了比你多幾分鐘的時間。 –

+1

@JREN我認爲初始化構造函數中的值會更有意義,因爲某些人可以在創建對象後立即調用get值。在這種情況下,由於這些值沒有啓動,它會拋出錯誤 –

0

這可以通過使用來完成java中的拆分元素 將字符串存儲在變量中,並在java中調用拆分方法。

string = "key1=value1&key2=value2&key3=value3"; 
String[] keys = string.split("&"); 

在下一步中,您可以使用'='字符在數組鍵的每個元素上執行拆分。

編號:How to split a string in Java

1

嘗試使用的BeanUtils和地圖

String[] keys = "key1=value1&key2=value2&key3=value3".split("&"); 
HashMap keyMap = new HashMap(); 
for(String key:keys){ 
String[] pair = key.split("="); 
keyMap.put(pair[0],pair[1]); 
} 
MyClass myCls=new MyClass(); 
BeanUtils.populate(myCls,keyMap); 
+0

+1來提出一個標準的Apache庫 – parasietje

1

隨着番石榴,你可以這樣做:

String str = "key1=value1&key2=value2&key3=value3"; 
Map<String, String> map = Splitter.on('&').withKeyValueSeparator("=").split(str); 

,比你可以用任何你想要的鍵和值做。例如。

mc.setKey1(map.get("key1")); // will set key1 to value1 
0
You can use java reflection : 

import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

public class MyClass { 

    private String key1; 
    private String key2; 
    private String key3; 

    public void setKey1(String key1) { 
    this.key1 = key1; 
    } 

    public void setKey2(String key2) { 
    this.key2 = key2; 
    } 

    public void setKey3(String key3) { 
    this.key3 = key3; 
    } 

    public void setKey(String input) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { 
    String[] strings = input.split("&"); 
    String methodName = null; 
    Method setter = null; 
    for(String keyValue : strings) { 
     String[] keyValuePair = keyValue.split("="); 
     methodName = toSetterMethod(keyValuePair[0]); 
     setter = getMethod(methodName); 
     if (setter != null) { 
     setter.setAccessible(true); 
     setter.invoke(this, keyValuePair[1]); 
     } 
    } 
    } 

    private Method getMethod(String methodName) { 
    try { 
     Method[] methods = MyClass.class.getMethods(); 
     for (Method method : methods) { 
     if (method.getName().equals(methodName)) { 
      return method; 
     } 
     } 
    } catch (SecurityException e) { 
    } 
    return null; 

    } 

    private String toSetterMethod(String property) { 
    String setter = "set"; 
    setter += property.substring(0, 1).toUpperCase() + property.substring(1); 
    return setter; 
    } 
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { 
    String input = "key1=value1&key2=value2&key3=value3"; 
    MyClass myClass = new MyClass(); 
    myClass.setKey(input); 

    System.out.println(myClass.key1); 
    System.out.println(myClass.key2); 
    System.out.println(myClass.key3); 


    } 

} 
+0

'不使用拆分方法?'是 – Manuel

+0

問題的一部分,但我認爲「拆分」方法不是一個大問題。你可以自己做。 – Nguyen