本文以具有5级关联的菜单项为例,介绍在J2ME如何获取这些具有级联关系的菜单。
代码可以直接运行,缺点是用Hashtable保存的数据,重新获取后并不按照原来的顺序显示出来,如果需要按照一定的顺序就需要用Vector。
package
test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Hashtable;
public class ParseOperation ... {
Hashtable ht = new Hashtable(); // 保存一级范围内的业务
Hashtable h1; // 保存二级范围内的业务
Hashtable h2; // 保存三级范围内的业务
Hashtable h3; // 保存四级范围内的业务
Hashtable h4; // 保存五级范围内的业务
/** *//**
* 解析业务代码(字符串)
* @param str0 业务代码
*/
private void parseString(String str0)...{
try ...{
InputStream is = new ByteArrayInputStream(str0.getBytes());
ByteArrayOutputStream bstr = new ByteArrayOutputStream();
boolean start = false; // 是否开始有片断的业务代码了,以'<>'为标志
boolean end = false; // 是否结束该片断的业务代码了,以'</>'为标志
boolean isNext = false; // 是否在'<'之后紧接着的字符就是'/'
int c;
String con1 = ""; // 一级业务的名称
String con2 = ""; // 二级业务的名称
String con3 = ""; // 三级业务的名称
String con4 = ""; // 四级业务的名称
String con5 = ""; // 五级业务的名称
String version = ""; // 业务代码当前的版本号
int classes = -1; // 业务的等级,指向'<'与'>'之间的数字
int type = 0; // 当前的业务类型,比如1代表'放号业务',2代表'套卡销售'等
while ((c = is.read()) != -1) ...{
switch (c) ...{
case '$':
isNext = false;
version = new String(bstr.toByteArray());
bstr.reset();
System.out.println("------- 开始分析 -------");
System.out.println("当前的版本号为: " + version);
break;
case '<':
isNext = true;
switch (classes)...{
case 0:
type = Integer.parseInt(new String(bstr.toByteArray()));
bstr.reset();
System.out.println(" 当前业务代码的类型级别为: " + type);
break;
case 1:
con1 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现一级业务: " + con1);
break;
case 2:
con2 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现二级业务: " + con2);
break;
case 3:
con3 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现三级业务: " + con3);
break;
case 4:
con4 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现四级业务: " + con4);
break;
case 5:
con5 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现五级业务: " + con5);
break;
}
start = true;
break;
case '>':
isNext = false;
if (start) ...{
classes = Integer.parseInt(new String(bstr.toByteArray()));
switch(classes)...{
case 1:
h1 = new Hashtable();
break;
case 2:
h2 = new Hashtable();
break;
case 3:
h3 = new Hashtable();
break;
case 4:
h4 = new Hashtable();
break;
}
bstr.reset();
start = false;
}
if(end)...{
classes = Integer.parseInt(new String(bstr.toByteArray()));
switch(classes)...{
case 1:
ht.put(con1, h1);
break;
case 2:
h1.put(con2, h2);
break;
case 3:
h2.put(con3, h3);
break;
case 4:
h3.put(con4, h4);
break;
case 5:
h4.put(con5, "");
break;
}
classes = -1;
bstr.reset();
end = false;
}
break;
case '/':
if(isNext)...{
end = true;
start = false;
isNext = false;
}else...{
bstr.write((char) c);
}
break;
default:
isNext = false;
bstr.write((char) c);
break;
}
}
is.close();
bstr.close();
} catch (Exception e) ...{
e.printStackTrace();
}
}
public void relation()...{
try...{
System.out.println(" ------ 级联读取数据 ------");
System.out.println("ht.size(): " +ht.size());
Enumeration e1 = ht.keys();
while(e1.hasMoreElements())...{
String s1 = (String)e1.nextElement();
System.out.println("1--------- " + s1);
Hashtable t2 = (Hashtable)ht.get(s1);
Enumeration e2 = t2.keys();
while(e2.hasMoreElements())...{
String s2 = (String)e2.nextElement();
System.out.println(" 2------- " + s2);
Hashtable t3 = (Hashtable)t2.get(s2);
Enumeration e3 = t3.keys();
while(e3.hasMoreElements())...{
String s3 = (String)e3.nextElement();
System.out.println(" 3----- " + s3);
Hashtable t4 = (Hashtable)t3.get(s3);
Enumeration e4 = t4.keys();
while(e4.hasMoreElements())...{
String s4 = (String)e4.nextElement();
System.out.println(" 4--- " + s4);
Hashtable t5 = (Hashtable)t4.get(s4);
Enumeration e5 = t5.keys();
while(e5.hasMoreElements())...{
String s5 = (String)e5.nextElement();
System.out.println(" 5- " + s5);
}
}
}
}
}
}catch(Exception ee)...{
ee.printStackTrace();
}
}
public static void main(String[] args)...{
ParseOperation po = new ParseOperation();
String str = "1.0$<1>一级业务<2>二级业务A<3>11100|三级业务A1</3><3>11200|三级业务A2</3>" +
"</2><2>二级业务B<3>12100|三级业务B1</3><3>12200|三级业务B2</3></2></1>" +
"<1>QQ<2>QQ-WW><3>31100|QQ-WW-301</3><3>QQ-WW-302<4>QQ-WW-302-401" +
"<5>31211|QQ-WW-302-401-501</5></4></3><3>QQ-WW-303><4>31310|QQ-WW-303-401</4>" +
"</3></2><2>QQ/(2)<3>QQ/(2)/(3A)</3><3>QQ/(2)/(3B)</3></2></1>";
po.parseString(str);
po.relation();
}
}
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Hashtable;
public class ParseOperation ... {
Hashtable ht = new Hashtable(); // 保存一级范围内的业务
Hashtable h1; // 保存二级范围内的业务
Hashtable h2; // 保存三级范围内的业务
Hashtable h3; // 保存四级范围内的业务
Hashtable h4; // 保存五级范围内的业务
/** *//**
* 解析业务代码(字符串)
* @param str0 业务代码
*/
private void parseString(String str0)...{
try ...{
InputStream is = new ByteArrayInputStream(str0.getBytes());
ByteArrayOutputStream bstr = new ByteArrayOutputStream();
boolean start = false; // 是否开始有片断的业务代码了,以'<>'为标志
boolean end = false; // 是否结束该片断的业务代码了,以'</>'为标志
boolean isNext = false; // 是否在'<'之后紧接着的字符就是'/'
int c;
String con1 = ""; // 一级业务的名称
String con2 = ""; // 二级业务的名称
String con3 = ""; // 三级业务的名称
String con4 = ""; // 四级业务的名称
String con5 = ""; // 五级业务的名称
String version = ""; // 业务代码当前的版本号
int classes = -1; // 业务的等级,指向'<'与'>'之间的数字
int type = 0; // 当前的业务类型,比如1代表'放号业务',2代表'套卡销售'等
while ((c = is.read()) != -1) ...{
switch (c) ...{
case '$':
isNext = false;
version = new String(bstr.toByteArray());
bstr.reset();
System.out.println("------- 开始分析 -------");
System.out.println("当前的版本号为: " + version);
break;
case '<':
isNext = true;
switch (classes)...{
case 0:
type = Integer.parseInt(new String(bstr.toByteArray()));
bstr.reset();
System.out.println(" 当前业务代码的类型级别为: " + type);
break;
case 1:
con1 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现一级业务: " + con1);
break;
case 2:
con2 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现二级业务: " + con2);
break;
case 3:
con3 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现三级业务: " + con3);
break;
case 4:
con4 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现四级业务: " + con4);
break;
case 5:
con5 = new String(bstr.toByteArray());
bstr.reset();
System.out.println("发现五级业务: " + con5);
break;
}
start = true;
break;
case '>':
isNext = false;
if (start) ...{
classes = Integer.parseInt(new String(bstr.toByteArray()));
switch(classes)...{
case 1:
h1 = new Hashtable();
break;
case 2:
h2 = new Hashtable();
break;
case 3:
h3 = new Hashtable();
break;
case 4:
h4 = new Hashtable();
break;
}
bstr.reset();
start = false;
}
if(end)...{
classes = Integer.parseInt(new String(bstr.toByteArray()));
switch(classes)...{
case 1:
ht.put(con1, h1);
break;
case 2:
h1.put(con2, h2);
break;
case 3:
h2.put(con3, h3);
break;
case 4:
h3.put(con4, h4);
break;
case 5:
h4.put(con5, "");
break;
}
classes = -1;
bstr.reset();
end = false;
}
break;
case '/':
if(isNext)...{
end = true;
start = false;
isNext = false;
}else...{
bstr.write((char) c);
}
break;
default:
isNext = false;
bstr.write((char) c);
break;
}
}
is.close();
bstr.close();
} catch (Exception e) ...{
e.printStackTrace();
}
}
public void relation()...{
try...{
System.out.println(" ------ 级联读取数据 ------");
System.out.println("ht.size(): " +ht.size());
Enumeration e1 = ht.keys();
while(e1.hasMoreElements())...{
String s1 = (String)e1.nextElement();
System.out.println("1--------- " + s1);
Hashtable t2 = (Hashtable)ht.get(s1);
Enumeration e2 = t2.keys();
while(e2.hasMoreElements())...{
String s2 = (String)e2.nextElement();
System.out.println(" 2------- " + s2);
Hashtable t3 = (Hashtable)t2.get(s2);
Enumeration e3 = t3.keys();
while(e3.hasMoreElements())...{
String s3 = (String)e3.nextElement();
System.out.println(" 3----- " + s3);
Hashtable t4 = (Hashtable)t3.get(s3);
Enumeration e4 = t4.keys();
while(e4.hasMoreElements())...{
String s4 = (String)e4.nextElement();
System.out.println(" 4--- " + s4);
Hashtable t5 = (Hashtable)t4.get(s4);
Enumeration e5 = t5.keys();
while(e5.hasMoreElements())...{
String s5 = (String)e5.nextElement();
System.out.println(" 5- " + s5);
}
}
}
}
}
}catch(Exception ee)...{
ee.printStackTrace();
}
}
public static void main(String[] args)...{
ParseOperation po = new ParseOperation();
String str = "1.0$<1>一级业务<2>二级业务A<3>11100|三级业务A1</3><3>11200|三级业务A2</3>" +
"</2><2>二级业务B<3>12100|三级业务B1</3><3>12200|三级业务B2</3></2></1>" +
"<1>QQ<2>QQ-WW><3>31100|QQ-WW-301</3><3>QQ-WW-302<4>QQ-WW-302-401" +
"<5>31211|QQ-WW-302-401-501</5></4></3><3>QQ-WW-303><4>31310|QQ-WW-303-401</4>" +
"</3></2><2>QQ/(2)<3>QQ/(2)/(3A)</3><3>QQ/(2)/(3B)</3></2></1>";
po.parseString(str);
po.relation();
}
}