一种读取列表字典结构嵌套字符串的方式

源码:

import java.io.*;
import java.util.*;
//给定一个含有csv格式的字符串,读取其中的信息
public class readcsv {
    	//格式字符串
	private static char c0=',';
	//字典字符串
	private static String s0=":";
	//调用函数,读取文件,并返回列表
	public static ArrayList<Object> read(File file) {
		ArrayList<Object> list;
		String s=readfile(file);
		s=check(s);
		list=new ArrayList<Object>(Arrays.asList(split(s)));
		readcsv1(list);
		return list;
	}
	//调用函数,读取字符串,并返回列表
	public static ArrayList<Object> read(String s){
		ArrayList<Object> list;
		s=check(s);
		list=new ArrayList<Object>(Arrays.asList(split(s)));
		readcsv1(list);
		return list;
	}
	//读取文件,生成待处理字符串
	private static String readfile(File file) {
		String s=null;
		try{
			FileInputStream fis=new FileInputStream(file);
			s=new String(fis.readAllBytes());
			s=s.replace("\"", "");
			fis.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
		return s;
	}
	//检查字符串中满足条件的子串并返回
	private static String check(String s) {
		int count1=0,count2=0,count3=0,count4=0;
		int start=0,end=0;
		for(int i=0;i<s.length();i++) {
			char c=s.charAt(i);
			if(c=='[') {
				count1++;
				if(count1==1)
					start=i;
			}
			else if(c==']')
				count2++;
			else if(c=='{')
				count3++;
			else if(c=='}')
				count4++;
			if(count1<count2||count3<count4) {
				System.out.println("格式不正确");
				break;
			}
			else if(count1==count2&&count1!=0) {
				end=i;
				break;
			}
		}
		s=s.substring(start+1,end);
		return s;
	}
	//如果字符串某一位置是'['或者'{',计算与其对应的']'或者'}'的位置。
	private static int count(String s,int k) {
		char c1,c2;
		int count1=0,count2=0;
		int mark=0;
		if(s.charAt(k)=='[') {
			c1='[';c2=']';
		}
		else if(s.charAt(k)=='{') {
			c1='{';c2='}';
		}
		else {
			c1=0;c2=0;
			System.out.println("charException");
		}
		for(int i=k;i<s.length();i++) {
			char cc=s.charAt(i);
			if(cc==c1)
				count1++;
			else if(cc==c2)
				count2++;
			if(count1==count2) {
				mark=i;break;
			}
		}
		return mark;
	}
	//利用字符变量c0分割字符串,并且跳过被"{}"或者"[]"包围的字符串。
	private static String[] split(String s) {
		ArrayList<Integer> list=new ArrayList<>();
		list.add(-1);
		for(int i=0;i<s.length();i++) {
			char c=s.charAt(i);
			if(c=='['||c=='{')
				i=count(s,i)-1;
			else if(c==c0)
				list.add(i);
		}
		list.add(s.length());
		//System.out.println(list);
		String[] strs=new String[list.size()-1];
		for(int i=0;i<strs.length;i++)
			strs[i]=s.substring(list.get(i)+1,list.get(i+1));
		return strs;
	}
	//把被'[]'包围的字符串变成List
	private static ArrayList<Object> genelist(String s){
		ArrayList<Object> list=null;
		if(s.charAt(0)=='['&&s.charAt(s.length()-1)==']') {
			String s1=s.substring(1,s.length()-1);
			list=new ArrayList<Object>(Arrays.asList(split(s1)));
		}
		else {
			System.out.println("格式不正确");
		}
		return list;
	}
	//把被'{}'包围的字符串变成Map
	private static TreeMap<String,Object> genemap(String s){
		TreeMap<String,Object> map=null;
		if(s.charAt(0)=='{'&&s.charAt(s.length()-1)=='}') {
			map=new TreeMap<String,Object>();
			String s1=s.substring(1,s.length()-1);
			if(s1.length()>0) {
				String[] ss=split(s1);
				for(String s2:ss) {
					String[] ss1=s2.split(s0,2);
					map.put(ss1[0], ss1[1]);
				}
			}
		}
		else {
			System.out.println("格式不正确");
		}
		return  map;
	}
	//判断一个字符串是不是被'[]'或者'{}'包围
	private static int  jud(String s) {
		int i=0;
		char c1=s.charAt(0);
		char c2=s.charAt(s.length()-1);
		if(c1=='['&&c2==']')
			i=1;
		else if(c1=='{'&&c2=='}')
			i=2;
		return i;
	}
	//读取类csv文件
	private static void readcsv1(ArrayList<Object> list) {
		for(int i=0;i<list.size();i++) {
			String s=(String)list.get(i);
			if(s.length()>0) {
				int k=jud(s);
				if(k==1) {
					ArrayList<Object> list1=genelist(s);
					readcsv1(list1);
					list.set(i, list1);
				}
				else if(k==2) {
					TreeMap<String,Object> map1=genemap(s);
					readcsv2(map1);
					list.set(i, map1);	
				}
			}
		}
	}
	//读取类csv文件
	private static void readcsv2(TreeMap<String,Object> map) {
		Set<String> set=map.keySet();
		for(String s1:set) {
			String s=(String)map.get(s1);
			if(s.length()>0) {
				int k=jud(s);
				if(k==1) {
					ArrayList<Object> list1=genelist(s);
					readcsv1(list1);
					map.put(s1, list1);
				}
				else if(k==2) {
					TreeMap<String,Object> map1=genemap(s);
					readcsv2(map1);
					map.put(s1, map1);
				}
			}
		}
	}

}

两个例子:

String s="[456,[wo],[ai],[ni],[[zhong],guo,[haha],gege],123]";
String s1="[4,5,6,[7,[{9:10,11:12,13:[14,15]},{16:{17:18}}],8],[],[],1,2,3]";

ArrayList<Object> list=readcsv.read(s);
ArrayList<Object> list1=readcsv.read(s1);
for(int i=0;i<list.size();i++)
	System.out.println(list.get(i));
System.out.println();
for(int i=0;i<list1.size();i++)
	System.out.println(list1.get(i));

运行结果:

​
456
[wo]
[ai]
[ni]
[[zhong], guo, [haha], gege]
123

4
5
6
[7, [{11=12, 13=[14, 15], 9=10}, {16={17=18}}], 8]
[]
[]
1
2
3

​

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值