2017/3/4,周六
最近项目中做个人信息设置模块,遇到了一个生日星座自动匹配问题,于是百度、Google了一翻,网上的大部分答案都是这样的:
//星座分割时间 int[] date = {20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22}; String[][] constellations = {{"摩羯座", "水瓶座"}, {"水瓶座", "双鱼座"}, {"双鱼座", "白羊座"}, {"白羊座", "金牛座"}, {"金牛座", "双子座"}, {"双子座", "巨蟹座"}, {"巨蟹座", "狮子座"}, {"狮子座", "处女座"}, {"处女座", "天秤座"}, {"天秤座", "天蝎座"}, {"天蝎座", "射手座"}, {"射手座", "摩羯座"}}; //星座生成 传进是日期格式为: yyyy-mm-dd public void setConstellations(String birthday) { String[] data = birthday.split("-"); int day = date[Integer.parseInt(data[1]) - 1]; String[] cl1 = constellations[Integer.parseInt(data[1]) - 1]; if (Integer.parseInt(data[2]) >= day) { tvUserDetailAstrology.setText(cl1[1]); } else { tvUserDetailAstrology.setText(cl1[0]); } }
将每个月份对应的星座存入一个二维数组中,然后根据日来判断是属于哪个星座。这是最常见的一种实现方式了,用的也比较普遍。
但对于Android开发,又有代码洁癖的我们来说肯定是会想进一切办法不让汉字出现在代码中的,所以我们可以这样:
private static String[] astrologyArray; private static String[][] constellations = new String[12][2]; static { astrologyArray = AppContext.getInstance().getResources().getStringArray(R.array.astrology_array); for (int i = 0; i < constellations.length; i++) { int k = i; for (int j = 0; j < constellations[i].length; j++) { constellations[i][j] = astrologyArray[k]; k += 1; } } }
string文件中:
<string-array name="astrology_array"> <item>魔羯座</item> <item>水瓶座</item> <item>双鱼座</item> <item>白羊座</item> <item>金牛座</item> <item>双子座</item> <item>巨蟹座</item> <item>狮子座</item> <item>处女座</item> <item>天秤座</item> <item>天蝎座</item> <item>射手座</item> <item>魔羯座</item> </string-array>
虽然代码多了那么一丢丢,但是还是值得的!
这样我们的思路还是和以前一样,只是将那个二维数组重新获取了而已,看着顺眼了好多!
可仔细观察下星座这个一维数组和二维数组后,我们发现其实他们都是相邻的,这个二维数组会不会有点多余了呢?对,你没看错,它就是个小三!
//为了便于查看先写这儿啦,代码中肯定是要写到string里面的,没有理由~ private static String[] astrologyArray = {"魔羯座, 水瓶座, 双鱼座, 白羊座, 金牛座, 双子座, 巨蟹座, 狮子座, 处女座, 天秤座, 天蝎座, 射手座, 魔羯座"}; //星座分割时间 int[] date = {20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22}; //星座生成 传进是日期格式为: yyyy-mm-dd public void setConstellations(String birthday) { String[] data = birthday.split("-"); int month = Integer.parseInt(data[1]); int compareDay = date[month - 1]; // 所查询日期在分割日之前,索引-1,否则不变 if (Integer.parseInt(data[2]) >= compareDay) { tvUserDetailAstrology.setText(astrologyArray[month]); } else { tvUserDetailAstrology.setText(astrologyArray[month - 1]); } }
这样我们就只需要这一个星座的一维数组就能准确的找到该日期所对应的星座啦!
由于本人水平有限,文中如有错误欢迎批评指正,小弟感激不尽!
最后,感谢兔子家的三哥(http://www.jianshu.com/u/87ae381f8e5b)对我工作的帮助和指导,谢谢!
本文GiutHub上Demo地址:https://github.com/IT-Talon/ConstellationSelect,如果对您的学习有点帮助,希望点个star, 谢谢!