2013-03-07 152 views
0

我有一個映射,它的鍵值與long一樣長且值爲String。地圖的值是從數據庫中獲得的,它的格式如下。要標記哈希映射中的值

1: BusinessPartner.name1,BusinessPartner.name2,BusinessPartner.name3,BusinessPartner.name4 
2: BusinessPartner.name1,BusinessPartner.name2,BusinessPartner.name3 
6: ADDRESS.addressline1,ADDRESS.addressline2,ADDRESS.addressline3 

其中1,2,6是關鍵。

我需要標記化爲鍵1的字符串,結果應該是 Businesspartner,其他值應該是name1,name2,name3,name4。 我這樣做是因爲我需要將這些值放入另一個地圖 Map(name1,name2,name3,name4)> 我可以拆分字符串,但如何將Businesspartner作爲其他實體的公用值

誰能告訴我如何做到這一點

感謝

回答

0

將這項工作你riquierment?

public class Tokenize { 

    static Long keysFromDB[] = {1L, 2L, 6L}; 
    static String stringsFromDB[] = { 
     "BusinessPartner.name1,BusinessPartner.name2,BusinessPartner.name3,BusinessPartner.name4", 
     "BusinessPartner.name1,BusinessPartner.name2,BusinessPartner.name3", 
     "ADDRESS.addressline1,ADDRESS.addressline2,ADDRESS.addressline3"}; 

    @Test 
    public void tokenize() { 
     // use linked hashmap to preserve the order 
     Map<Long, Set<String>> tokenized = new LinkedHashMap<Long, Set<String>>(); 
     int c = 0; 
     for(Long key : keysFromDB) { 
      // use linked hashset to preserve the order 
      Set<String> record = new LinkedHashSet<String>(); 
      String splitedDBStrings[] = stringsFromDB[c++].split("\\.|,"); 
      System.out.println("List: " + Arrays.asList(splitedDBStrings)); 
      for(String s : splitedDBStrings) { 
       record.add(s); 
      } 
      System.out.println("Set: " + record); 
      tokenized.put(key, record); 
     } 

     System.out.println(tokenized); 
    } 
} 
+0

非常感謝你,它的工作。再次感謝 – user1984839 2013-03-07 12:48:23

+0

不客氣! – A4L 2013-03-07 12:50:10

0

允許從頭開始:

final Pattern pattern = Pattern.compile("[,\\s*]?([^.]+)\\.([^,]+)[,\\s*]?"); 
final Map<Long, String> myMap = getMapFromSomewhere();  

for(final Map.Entry<Long, String> entry : myMap.entrySet()) { 
    final String myString = entry.getValue(); 
    final Matcher matcher = pattern.matcher(myString);  
    final Map<String, List<String>> tokenised = new HashMap<String, List<String>>(); 
    while (matcher.find()) { 
    final String key = matcher.group(1); 
    List<String> names = tokenised.get(key); 
    if(names == null) { 
     names = new LinkedList<String>(); 
     tokenised.put(key, names) 
    } 
    names.add(matcher.group(2)); 
    } 
    //do stuff with map. 
} 

正則表達式分解如下:

  • [,\\s*]?任選匹配逗號後未知的(或零)長度
  • 的空白
  • ([^.]+)\\.匹配到下一站之前的所有內容,然後是「。」。
  • ([^,]+)採取一切高達下一個逗號中的匹配組
  • [,\\s*]?任選逗號後未知的(或零)長度

測試箱子空格相符:

public static void main(String[] args) { 

    final Pattern pattern = Pattern.compile("[,\\s*]?([^.]+)\\.([^,]+)[,\\s*]?"); 

    final String myString = "BusinessPartner.name1,BusinessPartner.name2,BusinessPartner.name3,BusinessPartner.name4"; 
    final Matcher matcher = pattern.matcher(myString); 

    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
     System.out.println(matcher.group(2)); 
    } 
} 

輸出:

BusinessPartner 
name1 
BusinessPartner 
name2 
BusinessPartner 
name3 
BusinessPartner 
name4 
+0

我認爲他希望'BusinessPartner'和'ADDRESS'(字符串女巫重複)成爲結果的一部分 – A4L 2013-03-07 12:11:40

+0

編輯來做到這一點。 – 2013-03-07 12:23:21

+0

我想他只需要一次,他寫道'結果應該是Businesspartner,其他值應該是name1,name2,name3,name4.'因此'BusinessPartner,name1,name2,name3,name4' – A4L 2013-03-07 12:35:38

0

運行此

public static void main(String[] args){ 
    Map<Long, String> dbmap = new HashMap<Long, String>(); 
    dbmap.put((long) 1, "BusinessPartner.name1,BusinessPartner.name2,BusinessPartner.name3,BusinessPartner.name4"); 
    dbmap.put((long) 2, "BusinessPartner.name1,BusinessPartner.name2,BusinessPartner.name3"); 
    dbmap.put((long) 6, "ADDRESS.addressline1,ADDRESS.addressline2,ADDRESS.addressline3"); 

    //Loop through the Map 
    Iterator<Entry<Long, String>> iterator = dbmap.entrySet().iterator(); 
    while(iterator.hasNext()){ 

     Map.Entry<Long, String> entry = (Map.Entry<Long, String>) iterator.next(); 

     //Split the string on comma ',' 
     //result entries should be 'BusinessPartner.name1', 'BusinessPartner.name2' etc 
     String[] commaSplit = entry.getValue().split(","); 

     //loop through each entry 
     for(int x=0; x<commaSplit.length; x++){ 

      //Split on Full Stop 
      //Result should be 'BusinessPartner', 'name2' 
      String[] dotSplit = commaSplit[x].split("\\."); 

      //print out common Value 
      System.out.println("Common Value is : " + dotSplit[0]); 

      //print out second value 
      System.out.println("Second Value is : " + dotSplit[1]); 

      System.out.println(); 
     } 
    } 
} 

輸出是這樣的

Common Value is : BusinessPartner 
Second Value is : name1 

Common Value is : BusinessPartner 
Second Value is : name2 

Common Value is : BusinessPartner 
Second Value is : name3 

Common Value is : BusinessPartner 
Second Value is : name4 

Common Value is : BusinessPartner 
Second Value is : name1 

Common Value is : BusinessPartner 
Second Value is : name2 

Common Value is : BusinessPartner 
Second Value is : name3 

Common Value is : ADDRESS 
Second Value is : addressline1 

Common Value is : ADDRESS 
Second Value is : addressline2 

Common Value is : ADDRESS 
Second Value is : addressline3 
+0

謝謝朋友們的回覆 – user1984839 2013-03-08 07:25:12