public class Monkey {
public enum Sex {
MALE, FEMALE;
}
private Sex sex;
private int age;
public Sex getSex() {
return sex;
}
public void setSex(Sex sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isAdault() {
if (age > 1) {
return true;
} else
return false;
}
public void growUp() {
this.age++;
}
}
这时java实体类,比较简单,计算如下
public static int calMonkeys(int years) {
// 由于100年产生的猴子过多,存放在同一个list会溢出,所以通过map将猴子进行分组,分别存在不同的list中去
Map<Integer, List<Monkey>> monkeyGroup = new HashMap<Integer, List<Monkey>>();
Map<Integer, List<Monkey>> newBornedGroup = new HashMap<Integer, List<Monkey>>();
List<Monkey> group0 = new ArrayList<Monkey>();// 初始化第一组猴子
Monkey monkeyFst = new Monkey();
monkeyFst.setAge(1);
monkeyFst.setSex(Sex.MALE);
Monkey monkeyScd = new Monkey();
monkeyScd.setAge(1);
monkeyScd.setSex(Sex.FEMALE);
group0.add(monkeyFst);
group0.add(monkeyScd);
monkeyGroup.put(0, group0);
int monkeyNum = 2;
boolean overMemeory = false;// 判断每一组的猴子数量是否过大
for (int i = 0; i < years; i++) {
List<Monkey> bornedmonkeys = new ArrayList<Monkey>();// 设置第一组新生猴子的集合
Set<Integer> group = monkeyGroup.keySet();
for (Integer groupNum : group) {// 选择每一组猴子
List<Monkey> monkeys = monkeyGroup.get(groupNum);
for (Monkey monkey : monkeys) {// 生小猴子
monkey.growUp();// 猴子涨一岁
if (monkey.getSex().equals(Sex.FEMALE) && monkey.isAdault()) {
Monkey bornedMonkey = new Monkey();
bornedMonkey.setAge(0);
if (Math.random() > 0.5)
bornedMonkey.setSex(Sex.FEMALE);
else
bornedMonkey.setSex(Sex.MALE);
bornedmonkeys.add(bornedMonkey);
monkeyNum++;
}
}
if (monkeys.size() > 10000) {
continue;
}
monkeys.addAll(bornedmonkeys);
if (monkeys.size() > 10000) {
overMemeory = true;
}
}
if (overMemeory) {
monkeyGroup.put(i + 1, new ArrayList<Monkey>());
overMemeory = false;
}
}
return monkeyNum;
}