简单输出农历JAVA |从输入中找到一个动物 + color/type
Simple output Chinese calendar JAVA | Find an animal + color/type from input
我们有一个输入年份(1987、2015 等)和农历。
12 种动物每年都在变化。 5种颜色每2年变化一次。所以Green Monkey和Green Monkey之间的循环是60年。
该周期的第一年是 1984 年(因此是绿猴年)。
从 1984 年开始,我的计数是正确的,但无法提出关于如何在 1984 年之前正确计算它的正确问题。因此,当我输入 2005 时,一切都很好,而当我输入 1983 时,它计数错误;
所以我的第一个想法和代码是:
public static String getChineseType (int year) {
String answer = "42";
switch (year > 1984 ? (year-1984)%10/2 : SECOND OPTION {
case 0: answer = "Tree/Green"; break;
case 1: answer = "Fire/Red"; break;
case 2: answer = "Earth/Yellow"; break;
case 3: answer = "Metal/White"; break;
case 4: answer = "Water/Black"; break;
default: answer = "Wrong year num"; break;
}
switch (year > 1984 ? (year-1984)%12 : SECOND OPTION {
case 0: answer += " Rat"; break;
case 1: answer += " Ox"; break;
case 2: answer += " Tiger"; break;
case 3: answer += " Rabbit"; break;
case 4: answer += " Dragon"; break;
case 5: answer += " Snake"; break;
case 6: answer += " Horse"; break;
case 7: answer += " Goat"; break;
case 8: answer += " Monkey"; break;
case 9: answer += " Rooster"; break;
case 10: answer += " Dog"; break;
case 11: answer += " Pig"; break;
default: answer += " Wrong year num"; break;
}
return answer;
}
}
那么在没有数组的情况下 正确编码的最佳方法是什么?或者我们应该为 >= 1984 和 <1984 使用不同的开关运算符?
(year-1984)%10/2 equals
(year-984)%10/2,
(year-84)%10/2 ,
(year-4)%10/2,
(year+6)%10/2
并且年份 >0
使用 lookup table.
首先你需要去掉1984的信息。今年只在猴年出现时给你:1984 % 12 = 4
,所以12个周期的第4年是猴年。
注意:这里的12年周期是从0
年开始的!根据 1984 年是猴子的信息,我们可以得出 0
年的动物。我们的循环计数器与 Monkey is first 无关。
现在您可以创建查找 table:
private final static Map<Integer, String> ANIMAL_YEARS = new HashMap<Integer, String>(){{
//Check the actual values!!
put(0, "Rat");
put(1, "Ox");
put(2, "Tiger");
...
put(11, "Pig");
}};
现在要获得动物你只需要调用:
String animal = ANIMAL_YEARS.get(year%12);
颜色也可以这样:
private final static Map<Integer, String> COLOR_YEARS = new HashMap<Integer, String>(){{
//Check the actual values!!
put(0, "Tree/Green");
put(2, "Fire/Red");
put(4, "Earth/Yellow");
...
put(8, "Water/Black");
}};
那么您可以:
int decimal = year % 10;
String color = COLOR_YEARS.get(decimal%2==1?decimal-1:decimal);
我们有一个输入年份(1987、2015 等)和农历。 12 种动物每年都在变化。 5种颜色每2年变化一次。所以Green Monkey和Green Monkey之间的循环是60年。 该周期的第一年是 1984 年(因此是绿猴年)。 从 1984 年开始,我的计数是正确的,但无法提出关于如何在 1984 年之前正确计算它的正确问题。因此,当我输入 2005 时,一切都很好,而当我输入 1983 时,它计数错误; 所以我的第一个想法和代码是:
public static String getChineseType (int year) {
String answer = "42";
switch (year > 1984 ? (year-1984)%10/2 : SECOND OPTION {
case 0: answer = "Tree/Green"; break;
case 1: answer = "Fire/Red"; break;
case 2: answer = "Earth/Yellow"; break;
case 3: answer = "Metal/White"; break;
case 4: answer = "Water/Black"; break;
default: answer = "Wrong year num"; break;
}
switch (year > 1984 ? (year-1984)%12 : SECOND OPTION {
case 0: answer += " Rat"; break;
case 1: answer += " Ox"; break;
case 2: answer += " Tiger"; break;
case 3: answer += " Rabbit"; break;
case 4: answer += " Dragon"; break;
case 5: answer += " Snake"; break;
case 6: answer += " Horse"; break;
case 7: answer += " Goat"; break;
case 8: answer += " Monkey"; break;
case 9: answer += " Rooster"; break;
case 10: answer += " Dog"; break;
case 11: answer += " Pig"; break;
default: answer += " Wrong year num"; break;
}
return answer;
}
}
那么在没有数组的情况下 正确编码的最佳方法是什么?或者我们应该为 >= 1984 和 <1984 使用不同的开关运算符?
(year-1984)%10/2 equals
(year-984)%10/2,
(year-84)%10/2 ,
(year-4)%10/2,
(year+6)%10/2
并且年份 >0
使用 lookup table.
首先你需要去掉1984的信息。今年只在猴年出现时给你:1984 % 12 = 4
,所以12个周期的第4年是猴年。
注意:这里的12年周期是从0
年开始的!根据 1984 年是猴子的信息,我们可以得出 0
年的动物。我们的循环计数器与 Monkey is first 无关。
现在您可以创建查找 table:
private final static Map<Integer, String> ANIMAL_YEARS = new HashMap<Integer, String>(){{
//Check the actual values!!
put(0, "Rat");
put(1, "Ox");
put(2, "Tiger");
...
put(11, "Pig");
}};
现在要获得动物你只需要调用:
String animal = ANIMAL_YEARS.get(year%12);
颜色也可以这样:
private final static Map<Integer, String> COLOR_YEARS = new HashMap<Integer, String>(){{
//Check the actual values!!
put(0, "Tree/Green");
put(2, "Fire/Red");
put(4, "Earth/Yellow");
...
put(8, "Water/Black");
}};
那么您可以:
int decimal = year % 10;
String color = COLOR_YEARS.get(decimal%2==1?decimal-1:decimal);