Java分数计算器:解析

时间:2015-11-05 04:49:17

标签: java

我正在为学校做一个Java Fraction计算器,而我遇到的最大问题之一就是解析。当我只使用数字时,我可以使用它,但由于它是分数计算器,我们包括下划线(对于混合数字)和分数的反斜杠。当我使用除数字以外的字符时,我如何能够使用解析方法? 混合数字示例:4_7 / 8

2 个答案:

答案 0 :(得分:0)

尝试定义您的解析方法签名:import sys import mailbox import email import quopri import json import time from BeautifulSoup import BeautifulSoup from dateutil.parser import parse MBOX = 'Users/mymachine/client1/Takeout/Mail/archive.mbox' OUT_FILE = 'Users/mymachine/client1/Takeout/Mail/archive.mbox.json' def cleanContent(msg): msg = quopri.decodestring(msg) try: soup = BeautifulSoup(msg) except: return '' return ''.join(soup.findAll(text=True)) # There's a lot of data to process, and the Pythonic way to do it is with a # generator. See http://wiki.python.org/moin/Generators. # Using a generator requires a trivial encoder to be passed to json for object # serialization. class Encoder(json.JSONEncoder): def default(self, o): return list(o) def gen_json_msgs(mb): while 1: msg = mb.next() if msg is None: break yield jsonifyMessage(msg) def jsonifyMessage(msg): json_msg = {'parts': []} for (k, v) in msg.items(): json_msg[k] = v.decode('utf-8', 'ignore') for k in ['To', 'Cc', 'Bcc']: if not json_msg.get(k): continue json_msg[k] = json_msg[k].replace('\n', '').replace('\t', '').replace('\r', '')\ .replace(' ', '').decode('utf-8', 'ignore').split(',') for part in msg.walk(): json_part = {} if part.get_content_maintype() == 'multipart': continue json_part['contentType'] = part.get_content_type() content = part.get_payload(decode=False).decode('utf-8', 'ignore') json_part['content'] = cleanContent(content) json_msg['parts'].append(json_part) then = parse(json_msg['Date']) millis = int(time.mktime(then.timetuple())*1000 + then.microsecond/1000) json_msg['Date'] = {'$date' : millis} return json_msg mbox = mailbox.UnixMailbox(open(MBOX, 'rb'), email.message_from_file) f = open(OUT_FILE, 'w') for msg in gen_json_msgs(mbox): if msg != None: f.write(json.dumps(msg, cls=Encoder) + '\n') f.close() 。现在,你可以让它返回null。接下来,为您需要支持的各种方案编写单元测试。从简单开始。虽然你需要能够解析“-4_7 / 8”,但首先要确保你能解析“7”,“8”,“ - 4”,“7/8”,最后“-4_7 /” 8" 。一定要考虑边缘情况。你会用“2 / -3”做什么?你会解析那个或考虑无效的输入吗?示例测试可能如下所示:

BigDecimal parse( String )

然后,迭代地“修复”您的@Test public final void verifyParseOne() { assertEquals(new BigDecimal(1), parse("10/10")); } 函数,直到它通过所有测试。提示:您应该尝试将复杂场景分解为更简单的场景,并且可以通过让函数使用与给定的参数不同的参数调用自身并对结果执行某些操作来实现此目的。例如。假设您的函数已经知道如何正确解析“7”和“8”,并使用它为分子和分母创建单独的parse个对象。你怎么能把这两个对象变成一个呢?

通过调用以BigDecimalBigDecimal作为参数的任何char[]构造函数来作弊。

注意,您不需要使用String,您可以创建一个类似的域对象来表示数字。但是,这超出了这个问题的范围。

答案 1 :(得分:0)

解析时,主要关注的是:如何分隔不同的元素 - 或者使用哪些字符来分区字符串。在您的情况下,下划线字符将整数与它的小数部分分开,反斜杠将分子与分母分开。

有了这个,您可以将字符串拆分为有意义的部分。

要解析字符串,您可以像@ 3kings一样使用String.split()方法,这是单向的。

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29

String.split()将正则表达式作为要拆分的分隔符。

我们假设您收到1_2/3的输入并将其存储在名为inputParts的变量中,您可以将其拆分为_字符并返回一个数组为2元素,12/3

String[] inputParts = myInput.split("_");

然后你可以拆分小数部分,并返回另一个包含2个元素23的数组:

String[] fractionParts = inputParts[1].split("/");

您需要一些逻辑来处理您可能收到的不同输入。有时你可能只得到一小部分,有时候整数加上一小部分。