1

キー値が文字列と同じ長さと値を持つマップがあります。マップの値はデータベースから取得され、以下の形式になっています。

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) として別のマップに配置する必要があるため、これを行っています>文字列を分割できますが、ビジネスパートナーを他のエンティティの共通の値として取得する方法

誰でもこれを行う方法を教えてもらえますか

ありがとう

4

3 に答える 3

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
于 2013-03-07T12:11:41.050 に答える
0

これはあなたの要件に適していますか?

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);
    }
}
于 2013-03-07T12:03:50.517 に答える
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
于 2013-03-07T12:07:25.413 に答える