黑马程序员技术交流社区

标题: 有100个人围成一个圈,从1开始报数,报到14的这个人就要... [打印本页]

作者: jijiangrui    时间: 2016-5-30 10:39
标题: 有100个人围成一个圈,从1开始报数,报到14的这个人就要...
package com.itheima;
import java.util.ArrayList;
public class Test10 {
public static void main(String[] args) {
  // 定义一个TreeMap集合.
  TreeMap<Integer,Person> tm = new TreeMap<>();
  //定义循环,将编号作为键,人作为值存入TreeMap集合.
  for (Integer i = 1; i <= 100; i++) {
   tm.put(i, new Person());
  }
  //创建GetIndex对象,调用round方法获取结果.
  GetIndex gi = new GetIndex(tm);
  gi.round();
}
}
//定义一个类获取所需要的结果.
class GetIndex {
//把TreeMap集合作为参数传入本类中.
private TreeMap<Integer,Person> tm;
GetIndex(TreeMap<Integer,Person> tm) {
  this.tm = tm;
}
//定义计数器,记录报数情况.
int count = 0;
//定义ArrayList集合,用于存储在遍历过程中需要删除的键.
ArrayList<Integer> al = new ArrayList<>();
//将TreeMap集合转化为Set集合方便进行遍历,Set集合存储的是TreeMap集合中的键.
Set<Integer> set = null;
//用于对遍历到最后一个元素时进入下次遍历的判断.
Integer lastKey = null;
int size = 0;
//定义round方法进行递归.
public void round() {
  //删除TreeMap集合中需删除的映射关系,根据ArrayList集合中存储的键值.
  for (int y = 0; y < al.size(); y++) {
   tm.remove(al.get(y));
  }
  System.out.println(al);//测试用
  al.clear();//清空ArrayList集合.
  set = tm.keySet();//刷新遍历一次后的Set集合.
  lastKey = tm.lastKey();
  size = tm.size();
  //定义高级for循环对Set集合中存储的键进行遍历.
  for(Integer x : set) {
   //当TreeMap集合中只剩一个元素时,打印这个元素的值,该编号就是所要的结果.
   if (size == 1) {
    System.out.println(lastKey);
    break;
   }
   //遍历过程中根据计数器记录需删除的元素,存入ArrayList集合中.
   count++;
   if (14 == count) {
    al.add(x);
    count = 0;
   }
   //当遍历完成一次时,使用递归方法,开始下次遍历.
   if (x == lastKey)
    round();   
  }  
}
}
class Person {

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2