String处理

2 篇文章 0 订阅
2 篇文章 0 订阅
import java.math.BigDecimal;
import java.util.regex.*;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
class AlgorithmStringFormulationParseCalculator
{
	public static void main(String []args)
	{
		Scanner sc =new Scanner(System.in);//scanner 用于扫入;
		String s=sc.nextLine();//string是不变的用了SB,insert后match.start()就变了。用于配
		StringBuilder sb=new StringBuilder(s);//用于插
		Pattern p=Pattern.compile("[\\+\\-\\*\\/]");//用于匹配,提供插点,不是split,split,有破坏性
		Matcher m=p.matcher(s);//是String s的match,所以下面次序要处理一下
		BigDecimal bd=new BigDecimal("0.0");
		for (int i=0;m.find();i++)//但StringBuilder insert后就变化,下次的位置就变了所以用for,多一个记数,
			//find() is boolean 又类似next()有递进功能
		{	
			int j=m.start();//m.start()像sc=new Scanner(System.in);出现一次return一个值
			String s0=m.group();//同上
			if (s0.equals("-")==false)
			{
			sb.insert(j+2*i," ");//注意if 和else的{}//中级数学逻辑,高级用乘方去想
			sb.insert(j+2+2*i," ");
			}
			else 
			{
			sb.insert(j+2*i, "  ");//取负数保证双插
			}
			
		}
		System.out.println(sb);
		String s1=new String(sb);//不能直接等于
		Scanner sc1=new Scanner(s1);//sc不接受sb,sb被插的命, 插完再扫;
		List<String> ll=new ArrayList<String>();
		while(sc1.hasNext())
		{
			ll.add(sc1.next());//index,initial value done
		}
		System.out.println(ll);
		for (String s2:ll)
		{
			int j=ll.indexOf(s2);
			switch(s2)
			{
			case "/" : ll.set(j+1,Double.toString(Double.valueOf(ll.get(j-1))/Double.valueOf(ll.get(j+1))));
			ll.set(j-1,"0"); ll.set(j,"0");System.out.println(ll);break;
			case "*" : ll.set(j+1,Double.toString(Double.valueOf(ll.get(j-1))*Double.valueOf(ll.get(j+1))));
			ll.set(j-1,"0"); ll.set(j,"0");System.out.println(ll);break;
			case "+" : ll.set(j,"0");break;
			//case "+" : ll.set(j+1,Double.toString(Double.valueOf( ll.get(j-1))+Double.valueOf(ll.get(j+1))));
			//ll.set(j-1,"0"); ll.set(j,"0");System.out.println(ll);break;
			//11.set(j,"0");break;也行
			}
		}
		for (int i=0;i<ll.size();i++)
		{
			bd=bd.add(new BigDecimal(ll.get(i)));//Double除没问题,但除后相加要用BigDecimal
			//BigDecimal要用String构造,用Double有误差
		}
		System.out.println(bd);
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值