我正在为学校做一个Java Fraction计算器,而我遇到的最大问题之一就是解析。当我只使用数字时,我可以使用它,但由于它是分数计算器,我们包括下划线(对于混合数字)和分数的反斜杠。当我使用除数字以外的字符时,我如何能够使用解析方法? 混合数字示例:4_7 / 8
答案 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
个对象。你怎么能把这两个对象变成一个呢?
通过调用以BigDecimal
或BigDecimal
作为参数的任何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元素,1
和2/3
:
String[] inputParts = myInput.split("_");
然后你可以拆分小数部分,并返回另一个包含2个元素2
和3
的数组:
String[] fractionParts = inputParts[1].split("/");
您需要一些逻辑来处理您可能收到的不同输入。有时你可能只得到一小部分,有时候整数加上一小部分。