Java:如何将相似的字符串(项)分组到相应的数组(组)?

时间:2010-12-21 08:07:44

标签: java

我有以下字符串"0#Aitem, 0#Aitem2, 0#Aitem3, 1#Bitem, 1#Bitem2, 2#Citem, Nitem, Nitem2".

0#显示组号。因此Aitem, Aitem2, Aitem3将属于群组0。组Bitem, Bitem2中的1。组Citem中的2。如果没有组号,则它们将全部放在单独的组中。因此Nitem, Nitem2将被放入群组3

我想为每个组创建一个数组,并将“items”放在相应的组(数组)中。所以我最终会得到像

这样的东西
[array("Aitem,Aitem2,Aitem3"), array("Bitem, Bitem2"), array("Citem"), array("Nitem, Nitem2")]

我猜我需要一个arrayList来保存所有分别具有适当元素(items)的组(数组)。

这是我的开始,但我不知道这是否是最佳方法。该字符串是动态的,因此可以有任意数量的组,并且必须遵循上述条件。

String[] x = Pattern.compile(",").split("0#item, 0#item2, 0#item3, 1#item, 1#item2, 2#item, item");
   for (int ii=0; ii<x.length; ii++) {
       System.out.println(i + " \"" + x[ii] + "\"");
   }

5 个答案:

答案 0 :(得分:7)

我的回答显示了如何使用单一正则表达式来提取组和项目。然后,您可以将它们存储在地图中。

    String s =  "0#Aitem, 0#Aitem2, 0#Aitem3, 1#Bitem, 1#Bitem2, 2#Citem, Nitem, Nitem2";
    Pattern p = Pattern.compile("(\\d*)[#]{0,1}(\\w+?)(,|$)");        
    Matcher m = p.matcher(s);
    Map<String, List<String>> map = new TreeMap<String, List<String>>();
    while(m.find()){
        String group = m.group(1);
        String item = m.group(2);
        List<String> items = map.get(group);
        if(items == null){
            items = new ArrayList<String>();
            map.put(group, items);
        }
        items.add(item);
    }
    //let's print it out
    for(String key : map.keySet()){
        System.out.println(key + " : " + map.get(key));
    }

打印:

 : [Nitem, Nitem2]
0 : [Aitem, Aitem2, Aitem3]
1 : [Bitem, Bitem2]
2 : [Citem]

目前,没有组的项目键入空字符串。我将把它作为练习来处理这种情况。它应该只是找到最大键并递增它的情况。

我确信正则表达式也可以改进,因为它是用急速写的。

答案 1 :(得分:3)

//Create a map for storing groups
Map<String, Collection<String>> groupMap = new HashMap<String, Collection<String>>();

String[] parts = yourString.split("[, ]+"); //Split by each word
for (String part : parts) {   //Go over all words
    String[] subparts = part.split("#"); //Split to index and value

    String groupKey;
    String value;
    if (subparts.length == 1) { //There is no '#' sign
        groupKey = null;
        value = subparts[0];
    } else if (subparts.length == 2) { //There is one '#'sign
        groupKey = subparts[0];
        value = subparts[1];
    } else {
        throw new IllegalArgumentException("Can not parse string");
    }

    Collection<String> groupContents = groupMap.get(groupKey); //Extract list of items in this group
    if (groupContents == null) { //If there was no such group yet - create one
        groupMap.put(groupKey, groupContents = new ArrayList<String>());
    }
    groupContents.add(value); //Add item to group
}

答案 2 :(得分:2)

HashMap<String,List<String> myItems = new HashMap<String,List<String>);

然后,您可以使用sting别名来设置所需的任何课程,并存储尽可能多的项目。

答案 3 :(得分:1)

你是正确的,但我想纠正你一点。

使用以下正则表达式进行拆分:str.split("\\s*,\\s*")。这将支持所有可能的空间。

当您获得单独的项目时,您必须再次拆分它:item.split("#")

存储所有这些创建数据结构,如List<List<String>>。然后执行以下操作:

String[] parts = item.split("#");
int group = Integer.parseInt(parts[0]);
String itemName = parts[1];
List<String> groupList = allGroups.get(group);
if (groupList == null) {
   groupList = new ArrayList<String>();
   allGroups[group] = groupList;
}
groupList.add(itemName);

如果代码示例包含语法错误,我很抱歉。它写在这里,在网站上,应该只是帮助你看到这个想法。

答案 4 :(得分:0)

另一种基于地图的解决方案。

    System.out.println("###Parsing results and populating map");
    String[] x = Pattern.compile("\\s*,\\s*").split(
            "0#item, 0#item2, 0#item3, 1#item, 1#item2, 2#item, item");

    Map<String, List<String>> result = new TreeMap<String, List<String>>();

    for (int i = 0; i < x.length; i++) {
        String y[] = x[i].split("#");

        if (y.length > 1) {
        System.out.println("group: '" + y[0] + "' item: '" + y[1] + "'");
            List<String> l = result.get(y[0]);
            if(l==null){
                l = new ArrayList<String>();
                result.put(y[0], l);
            }
            l.add(y[1]);
        }
    }

    System.out.println("###Returning values stored in map, as separate arrays");
    for(Entry<String,List<String>> entry: result.entrySet()){
        System.out.println("Group:" + entry.getKey());
        //System.out.println("Items:");
        List <String> l = entry.getValue();
        // This is where the final array is
        String[] finalArray = l.toArray(new String[1]);
        for (int i = 0; i < finalArray.length; i++) {
            System.out.println(finalArray[i]);
        }

    }