比如输入一个表示集合的字符串{1,a,{5,6},<4,6>}
处理的目标是这样的
遇到1则生成一个Integer对象,遇到a生成一个String对象,遇到{5,6}生成另外一个集合对象,遇到<4,6>则生成一个自定义的对象。
这种情况怎么处理啊 各位大侠给点思路啊
处理的目标是这样的
遇到1则生成一个Integer对象,遇到a生成一个String对象,遇到{5,6}生成另外一个集合对象,遇到<4,6>则生成一个自定义的对象。
这种情况怎么处理啊 各位大侠给点思路啊
楼主【cut21】截止到2008-07-25 11:24:58的历史汇总数据(不包括此帖):
发帖的总数量:8 发帖的总分数:380 每贴平均分数:47
回帖的总数量:5 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:8 结贴的总分数:380
无满意结贴数:1 无满意结贴分:30
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:12.50 % 无满意结分率:7.89 %
敬礼!
比如输入一个表示集合的字符串{1,a,{5,6}, <4,6>}
1是个数字,是否允许多为的数存在?
a这里是否允许多个字母的串?
提供一个基本的思路,类似于编译原理中的词法分析吧.
循环判断
一开始可以使用一个count计数,记录访问到字符串中的第几个字符.
判断,如果是数字(多位的话继续取),如何处理..
如果是字母(多个字母的串同样向下取),处理...
如果是'{‘,直接从当前位置开始找下一个配对的’}‘,把这两个位置中的串取出,就是一个子集合,count计数跳到’}‘的后面,继续循环
如果是’<',直接从当前位置找下一个配对的‘>',把这两个位置中的串取出,创建你自定义的对象,count技术跳到‘>'的后面,继续循环
如果是',',改变count,进入下一次循环差不多这个意思,思想很简单,可能有不完善的地方,拍砖就不必了。
indexOf()方法可以从指定位置开始查找某个字符的位置。
构造方法为public Sembling(string str)
比如str传入{a,c,d,{e,f}}
能将a,c,d变成string对象 将{e,f}转换成集合对象(也就是Sembling)(将一个一个对象按不同格式选出来)存储到集合的数据结构当中
另外再请教各位高手一个问题
集合当中重复元素是怎样处理的 大家给个思路
此贴明日将加到100分
import java.util.Vector;public class Sembling{
public static final String LEFTCOL = "{"; //符号标识,"{",可以根据需要变成"<"
public static final String RIGHTCOL = "}"; //符号标识,"}",可以根据需要变成">"
public static final String SPLITER = ","; //符号标识,",",可以根据需要变成";"
//{a,c,d,{e,f}}
Vector sets; //集合
String toString; //只是用来toString(),方便打印
public Sembling(String para){
sets = parse(para);
toString = para;
}
/**
* 解析字符串比如传入{a,c,d,{e,f}}能将a,c,d变成string对象 将{e,f}转换成集合对象(也就是Sembling)(将一个一个对象按不同格式选出来)存储到集合的数据结构当中
* @param str
* @return
*/
public Vector parse(String str){
Vector vec = new Vector();
//step1,或取"{""}"的位置
int subStartPos = str.indexOf(LEFTCOL);
if(subStartPos >=0 ){
subStartPos += 1;
}else{
subStartPos = 0;
}
int subEndPos = str.lastIndexOf(RIGHTCOL);
if(subEndPos <0 ){
subEndPos = str.length();
}
//step2取数据,既去掉"{}";
String tmp = str.substring(subStartPos,subEndPos);
//step3将数据一个一个取出,并放入vec中
String[] groups = tmp.split("\\" + LEFTCOL);
for(int i=0; i<groups.length; i++){
if(groups[i].indexOf(RIGHTCOL) >=0){
vec.add(new Sembling(LEFTCOL + groups[i]));
}else{
String[] strGroups = groups[i].split(SPLITER);
for(int j=0; j<strGroups.length; j++){
vec.add(strGroups[j]);
}
}
}
return vec;
}
/**
* 或取集合
* @return
*/
public Vector getSets(){
return sets;
}
public int size() {
return sets.size();
}
public String toString(){
return toString;
}
/**
* 测试:将一个Sembling中的每一个元素打印出
* @param args
*/
public static void main(String[] args){
Sembling sm = new Sembling("{a,c,d,{e,f}}");
Iterator itor = sm.getSets().iterator();
while(itor.hasNext()){
System.out.println(itor.next().toString());
}
}
}
我的问题是如何处理存入的元素有重复的现象
这几行代码有点问题
//step3将数据一个一个取出,并放入vec中
String[] groups = tmp.split("\\" + LEFTCOL);
for(int i=0; i <groups.length; i++){
if(groups[i].indexOf(RIGHTCOL) >=0){
vec.add(new Sembling(LEFTCOL + groups[i]));
}
……
如果构造方法传的是{d,{e,f},w,t}则这里的
groups[0]=d//正确
groups[1]={e,f},w,t//会讲w,t误传入到新new的Sembling当中
step3中的bug修改修改(用正则简单一些)。
(下午有事,晚上来修改)重复的数据只是数据重复而已,这些数据还有坐标啊,所以可以存在重复的数据,如果不想保存重复的数据,在
vec.add()时处理一下就可以了
import java.util.Vector;public class Sembling {
public static final String LEFTCOL = "{"; // 符号标识,"{",可以根据需要变成" <"
public static final String RIGHTCOL = "}"; // 符号标识,"}",可以根据需要变成">"
public static final String SPLITER = ","; // 符号标识,",",可以根据需要变成";"
// {a,c,d,{e,f}}
Vector sets; // 集合
String toString; // 只是用来toString(),方便打印
SemQueue semQueue = new SemQueue(); public Sembling(String para) {
sets = parse(para);
toString = para;
} /**
* 解析字符串比如传入{a,c,d,{e,f}}能将a,c,d变成string对象
* 将{e,f}转换成集合对象(也就是Sembling)(将一个一个对象按不同格式选出来)存储到集合的数据结构当中
*
* @param str
* @return
*/
public Vector parse(String str) {
Vector vec = new Vector(); // step1,获取"{""}"的位置
int subStartPos = str.indexOf(LEFTCOL);
if (subStartPos >= 0) {
subStartPos += 1;
} else {
subStartPos = 0;
} int subEndPos = str.lastIndexOf(RIGHTCOL);
if (subEndPos < 0) {
subEndPos = str.length();
}
// step2取数据,既去掉"{}";
char[] tmp = str.substring(subStartPos, subEndPos).toCharArray(); int count = 0; // 记录"{"的个数,嵌套递归用
// step3将数据一个一个取出,并放入vec中
for (int i = 0; i < tmp.length; i++) {
if (String.valueOf(tmp[i]).equalsIgnoreCase(LEFTCOL)) {
count++;
} if (String.valueOf(tmp[i]).equalsIgnoreCase(SPLITER)) {
if (count == 0) {
if (!semQueue.isEmpty()) {
vec.add(semQueue.getQueue());
}
continue;
}
} semQueue.add(tmp[i]);// 放入队列
if (String.valueOf(tmp[i]).equalsIgnoreCase(RIGHTCOL)) {
count--;
if (count == 0) {
vec.add(new Sembling(semQueue.getQueue()));
}
} }
// step4:因为","有可能不结尾,所以需要将semQueue中的值取出
String lastObj = semQueue.getQueue();
if (lastObj.indexOf(LEFTCOL) >= 0) {
vec.add(new Sembling(lastObj));
} else {
vec.add(lastObj);
} return vec;
} /**
* 获取集合
*
* @return
*/
public Vector getSets() {
return sets;
} public int size() {
return sets.size();
} public String toString() {
return toString;
} /**
* 测试:将一个Sembling中的每一个元素打印出
*
* @param args
*/
public static void main(String[] args) {
Sembling sm = new Sembling("{a,c,d,{e,k},y,{{e,ks},{3,4}},s}");
Iterator itor = sm.getSets().iterator();
while (itor.hasNext()) {
System.out.println(itor.next().toString());
}
}
}/**
* 一个队列,缓存用.
*
* @author Administrator
*
*/
class SemQueue extends Vector { /**
* 返回队列的值:c 或 {s,e},并清空
*
* @return
*/
public String getQueue() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < this.size(); i++) {
buf.append(this.get(i));
} this.removeAllElements();
return buf.toString();
}
}
1,改进了19楼的问题
2,支持嵌套递归(即大括号中含有n层Sembling)如解析{a,c,d,{e,k},y,{{e,ks},{3,4}},s}
输出:
a
c
d
{e,k}
y
{{e,ks},{3,4}}
s
a
c
d
{e,k},y,{e,k},
{3,4}},s