----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
入学考试八道题在张老师的视频中都有讲到,只是第一道题做的时候,有些紧张,对于java的泛型考虑不严谨,所以在通过反射取add方法的参数时,直接用getMethod("add", Integer.class),未考虑到参数的去泛型话,通过查看api文档,才了解到List数组的add方法本身就是泛型的,所以应采用基类的字节码,即Object类的字节码。第一题原题如下:ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。
做到第九道题时感觉有点幸运,因为这道题是自己以前参加蓝点杯比赛的时候做的原题,不过以前是用C编写的,不过解题的思路还清楚,于是很快就解决了,出现一点小问题就是迭代的条件的判断,因为关于i++的值传递问题,不过通过debug很快就发现了问题。
真正感觉有难度的是第十题,这道题用了一天的时间才解决掉。第十题的题目是金额转换,阿拉伯数字转换成中国传统形式。 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整 。因为刚开始的时候没有很好的划分,原来想是把数据八位八位的分割,然后八位单独处理。可是经过研究单位之间的转换发现一个规律,就是很多时候都要单独处理以千为单位的四位数字,因此决定把他抽象出来作为一个独立的方法。这样一来紧跟着就进行分类,发现(个)圆,万,亿,万亿这都是四个间隔的,考虑实际的需要因此只做到万亿这个单位计量,这样就避免了原来的迭代。因为迭代中还涉及到单位之间的转换。先跟着确定大的框架,最让人头疼的是如何将多余的零去掉,结果发现自己对去零很不了解,经过搜索相关的业务和观察例子,得出如果四位全部为零的话,则只保留一个零,但是整数的最后四位除外,如果一个四位数的连续末尾有一个零,2个零,3个零则把零去掉,如果是前面有连续两个或三个零的话,则转换成一个零,但是除了整数部分的第一个四位除外。后经过代码的反复debug,终于完成了。代码如下:
class Arabic2China {
private String[] bigUnit = { "圆", "万", "亿", "万亿" };
private String[] smallUnit = { "千", "百", "拾" };
private String[] chineseCapital = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
"捌", "玖" };
private String[] decimals = { "角", "分" };
public String arabic2RMB(String num) {
String result = null;
StringBuilder sb = new StringBuilder();
String decimaStr = "";
String integerStr = "";
String end = "";
int testIndex = num.indexOf('.');
// 如果有小数部分则分为两部分处理,否则为整数
if (testIndex != -1) {
// 保留两位有效数字
decimaStr = num.substring(num.indexOf('.') + 1,
num.indexOf('.') + 3);
integerStr = num.substring(0, num.indexOf('.'));
// 给小数部分加单位和转换数字
end = decimaChange(decimaStr);
}
integerStr = num;
// 给整数部分加单位和转换数字
int length = integerStr.length();
if (integerStr.length() % 4 == 0) {
// 把整数部分分成4位一组,作为一个单元
int part = integerStr.length() / 4;
for (int i = 0; i < part; i++) {
String spiltInteger = integerStr.substring(
length - 4 * (i + 1), length - 4 * i);
sb.insert(0, addUnit(spiltInteger, i));
}
result = sb.toString();
} else {
// 不能被4整除的话,在最前面用零补充到可以被4整除
int part = integerStr.length() / 4 + 1;
int fillZeroNum = 4 - integerStr.length() % 4;
StringBuilder tmpSB = new StringBuilder(integerStr);
for (int i = 0; i < fillZeroNum; i++) {
tmpSB.insert(0, "0");
}
String newIntegerStr = tmpSB.toString();
for (int i = 0; i < part; i++) {
length = newIntegerStr.length();
String newSpiltIntegerStr = newIntegerStr.substring(length - 4
* (i + 1), length - 4 * i);
sb.insert(0, addUnit(newSpiltIntegerStr, i));
}
result = sb.toString();
}
// 如果没有小数部分,则添加”整“
if (end.equals("")) {
result += "整";
}
// 如果开头是零的话,则把零清除掉
if (result.substring(0, 1).equals("零")) {
result = result.substring(1);
}
return result + end;
}
// 小数部分转换加单位
private String decimaChange(String decimaStr) {
String decimaResult = null;
StringBuilder decimaSb = new StringBuilder();
for (int i = 0; i < decimaStr.length(); i++) {
//如果是零不加单位
if (decimaStr.charAt(i) == '0') {
int k = decimaStr.charAt(i) - 48;
decimaSb.append(chineseCapital[k]);
} else {
int k = decimaStr.charAt(i) - 48;
decimaSb.append(chineseCapital[k] + decimals[i]);
}
}
decimaResult = decimaSb.toString().replace("零零", "");
return decimaResult;
}
// 整数部分添加单位并完成数字转换
private String addUnit(String splitInteger, int index) {
String result = null;
StringBuilder sb = new StringBuilder();
String endTmp = bigUnit[index];
changeChineseDigital(splitInteger, sb);
if (index > 0) {
// 如果4位有效数字都是零则保留一个零,如果是尾部有两个或三个零,则清除,否则保留一个
String strSb = sb.toString().replaceAll("[零]{2,3}", "零");
sb=new StringBuilder(strSb);
if (sb.substring(sb.length() - 1).equals("零")){
sb =new StringBuilder(sb.substring(0,sb.length() - 1)) ;
}
else{
sb = new StringBuilder(strSb);
}
if (Integer.parseInt(splitInteger) != 0)
result = sb.toString() + endTmp;
else
result = sb.toString();
} else {
String strSb = sb.toString().replaceAll("[零]{2,3}", "零");
sb=new StringBuilder(strSb);
if (sb.substring(sb.length() - 1).equals("零")){
sb =new StringBuilder(sb.substring(0,sb.length() - 1)) ;
}
else{
sb = new StringBuilder(strSb);
}
result = sb.toString() + endTmp;
}
return result == null ? "" : result;
}
// 将整数部分转换成中国传统数字
private void changeChineseDigital(String splitInteger, StringBuilder sb) {
for (int i = 0; i < splitInteger.length(); i++) {
//如果是零不需要加单位
if (splitInteger.charAt(i) == '0') {
int k = splitInteger.charAt(i) - 48;
sb.append(chineseCapital[k]);
} else {
int k = splitInteger.charAt(i) - 48;
// 千,百,拾加上,个位不许要加
if (i != splitInteger.length() - 1) {
sb.append(chineseCapital[k] + smallUnit[i]);
} else {
sb.append(chineseCapital[k]);
}
}
}
}
}
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------