有个java算法题,求助大佬们

起灬風了 2019-04-24 10:31:36
将一段字符串按规则解析成多个预期类型的枚举值,请简述算法。

字符串分割符:1、分号 2、逗号

字符串示例:

"1123",'123',1,1.1,2.1,true,false,{"d":11},[1,2,3,4,5],${return '1'},<xml>12312</xml>,ere2342qweqwe1

这段字符串会解析成11个枚举值,类型解析规则如下:

1.双引号或者单引号括起来的会在java中解析成字符串

2.不区分大小写等于true或者false值,被解析成bool值

3.以{}括起来或者[]括起来的被解析成json对象

4.${}括起来的,被解析成groovy代码片段

5.以<{名称}></{名称}>括起来的解析成xml片段

6.以数字开头或者-开头且不包含小数点的被解析成长整形

7.以数字开头或者-开头且包含小数点的被解析成双精度浮点型

8.不满足以上条件且不包含分割符,全部解析成字符串



不满足以上解析规则的,抛错,提示用户具体一个片段解析异常
...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdonghai 2019-04-25
  • 打赏
  • 举报
回复

package jp19042502;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MyClass
{
private static Map<String, StringBuilder>ListMap=new HashMap<String, StringBuilder>();
private static String gString="\"1123\",'123',1,1.1,2.1,true,false,{\"d\":11},[1,2,3,4,5],${return '1'},<xml>12312</xml>,ere2342qweqwe1,$,-1,-3.5,01,02a,02a.,01.0";

private static String cT_STR="字符串";
private static String cT_BOOL="布尔";
private static String cT_JSON="JSON";
private static String cT_GRV="groovy";
private static String cT_XML="XML";
private static String cT_INT="长整形";
private static String cT_FLOAT="浮点型";
private static String cT_UNKNOWN="未知";

private static void splitStr()
{
ListMap.put(cT_STR, new StringBuilder());
ListMap.put(cT_BOOL, new StringBuilder());
ListMap.put(cT_JSON, new StringBuilder());
ListMap.put(cT_GRV, new StringBuilder());
ListMap.put(cT_XML, new StringBuilder());
ListMap.put(cT_INT, new StringBuilder());
ListMap.put(cT_FLOAT, new StringBuilder());
ListMap.put(cT_UNKNOWN, new StringBuilder());

ArrayList<String>list=new ArrayList<String>();

StringBuilder AFGStr=new StringBuilder(gString);
int len=AFGStr.length();
if(len<=0) return;
if(AFGStr.charAt(0)==',')
{
len--;
AFGStr.delete(0, 1);
}
if(AFGStr.charAt(len-1)!=',')
{
len++;
AFGStr.append(',');
}

int iB=1,iYH=0;
list.clear();
for(int i=0;i<len;i++)
{
char c=AFGStr.charAt(i);
if((c=='\"') | (c=='\'') | (c=='[')) iYH++;
if(c==']') iYH--;
if((c==',') & (iYH %2==0))
{
String sTmp=AFGStr.substring(iB-1, i);
if(sTmp.length()>0)
list.add(sTmp);

iB=i+2;
iYH=0;
}
}

for(String s:list)
{
if(s.length()<=0) continue;
String sType=cT_STR;
char c=s.charAt(0);
if((c=='\"') | (c=='\'')) sType=cT_STR;
else if ((c=='[') | (c=='{')) sType=cT_JSON;
else if (c=='$')
{
if(s.length()<=1) sType=cT_UNKNOWN;
else if (s.charAt(1)=='{') sType=cT_GRV;
}
else if (c=='<')
{
int k=s.indexOf('>');
if(k>0)
{
String sName=s.substring(1, k);
if (s.indexOf("</"+sName)>0) sType=cT_XML;
}
}
else if((c=='-') | ("0123456789".indexOf(c)>0))
{
if(s.indexOf('.')>0)
{
sType=cT_FLOAT;
try {
Float.valueOf(s);
}
catch(Exception e)
{
sType=cT_STR;
}
}
else {
sType=cT_INT;
try {
Integer.valueOf(s);
}
catch(Exception e)
{
sType=cT_STR;
}
}
}
else if ((s.toLowerCase().equals("true")) | (s.toLowerCase().equals("false"))) sType=cT_BOOL;
else sType=cT_UNKNOWN;

StringBuilder sb=ListMap.get(sType);
if(sb.length()>0) sb.append(",");
sb.append(s);
}

System.out.print(ListMap.toString());
}

public static void main(String[] args)
{
// TODO 自动生成的方法存根
splitStr();
}

}

起灬風了 2019-04-25
  • 打赏
  • 举报
回复
是的呢,不过ere2342qweqwe1这个是无法解析的
wdonghai 2019-04-25
  • 打赏
  • 举报
回复
输出结果是不是这样的:
字符串="1123",'123',ere2342qweqwe1
长整形=1
浮点型=1.1,2.1
布尔=true,false
JSON={"d":11},[1,2,3,4,5]
groovy=${return '1'}
XML=<xml>12312</xml>

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧