我有以下字符串"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] + "\"");
}
答案 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]);
}
}