最经典、精辟的练习,让你体会java的应用技巧和激情!【会不断的更新,苦力原创,转摘请说明来源。谢谢~】
1.名称:猜数字 知识点:全局变量、局部变量、对象引用
题目:
1.电脑自动随机抽取1-100之间的一个数字R
2.输入一个数字A,如果该数字比R小,则范围变成A-100,反之,则范围变成1-A
3.当输入的数字和R相等时,游戏结束,否则,继续重复步骤2
参考程序:
package roy;
import java.util.*;
public class OpenMouthBingo{
private int max=100;//最大值
private int min=1;//最小值
private int count=10;//可以猜的次数
private String[] strs = {"逃过一劫","扫厕所","掌上压"};
private int guess;
public static void main(String args[]){
new OpenMouthBingo().menu();
}
public boolean change(int number){
boolean flag =true;
if(number>guess){
max = number;
}else if(number
2.名称:抽卡片 知识点:异常处理、代码封装
题目:
写一个程序:
{ A,2,3,......K}
1、从控制台输入 要抽取不重复的牌的数目
2、每次抽取如果有重复的话,抛出自己定义的异常(重复),然后重新抽取
3、打印抽取出来的牌和抽取的次数
参考程序:
package roy;
import java.util.*;
public class Card{
//1、从控制台输入 要抽取不重复的牌的数目
//2、每次抽取如果有重复的话,抛出自己定义的异常(重复),然后重新抽取
String[] cards = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//String[] cards = {"A","2","3","4","5","6","7"};
//String[] cards = {"A","2","3","4","5"};
String[] store;//我们因为不知道用户要抽多少张牌,所以在这里不能初始化大小
//要根据用户输入的数目来确定
private int currentNumber=0;//当前使用哪个下标的位置存放卡片
private int totalGet=0;
//抽取卡的操作
public String getCardByRandom(){
Random random = new Random();
int number = random.nextInt(10);//0~12
return cards[number];//返回那张牌
}
//菜单开始
public void start(){
boolean flag= true;
Scanner sc = new Scanner(System.in);
System.out.println("请问您要抽取多少张卡片:");
int count = sc.nextInt();
if(count>13){
System.out.println("不能多于13张牌!");
flag =false;
}
//因为每次抽取到一张不重复的卡片的时候,我们就把它存放起来
store = new String[count];//按照你要抽取多少张,我就创建多大的存储空间
//因为每次抽取都会把牌放回去
while(flag){
//每抽一次计算一次
totalGet++;
//开始抽牌
String card = getCardByRandom();
try{
compare(card);//只是用来判断比较是否重复
//如果不抛异常,程序继续运行
store[currentNumber]=card;
currentNumber++;
}catch(Exception e){
e.printStackTrace();
}
//退出继续抽取的条件
if(currentNumber==count){
break;
}
}
display();//3、打印抽取出来的牌和抽取的次数
}
//3、打印抽取出来的牌和抽取的次数
public void display(){
if(store[0]!=null){
System.out.println("抽取了 "+totalGet+" 次");
System.out.println("抽到的牌是:");
for (int i=0;i
3.名称:武装船 知识点:匿名内部类的使用、多态的使用、接口的使用
题目:接口如下
package roy;
//武器的接口
public interface Weapon{
public void fire();
public void description();
}
//船的接口
interface Ship{
//安装武器
public void install(Weapon w);
//发射武器
public void shoot();
}
/*
要求:开发3种武器,可以随时切换安装到船就马上使用,不用对该类进行维护
*/
class Start{
}
参考程序:
package roy;
/*
描述:匿名内部应用
时间:2011-8-16
*/
import java.util.*;
public interface Weapon{//武器
//开火
public void fire();
//描述
public void description();
}
interface Ship{//船
//安装武器
public void install(Weapon w);
//射击
public void shoot();
}
class Start{
Weapon w = null;
boolean flag = true;//判断选择武器循环
boolean check = true;//判断攻击循环
Scanner sc = new Scanner(System.in);
Ship s = new Ship(){//用匿名内部类重写船
//安装武器
public void install(Weapon w){
w.description();
System.out.println("安装完毕!");
System.out.println("---------------------------");
}
//射击
public void shoot(){
w.fire();
}
};
//选择武器
public void start(){
while (flag){
System.out.println("选择武器: 1.机枪 2.大炮 3.导弹 4.退出");
String str = sc.next();
int choose = Integer.parseInt(str);
switch (choose){
case 1:{
w = new Weapon(){//选择机枪时,重写武器的方法
public void fire(){
System.out.println("机枪开火!!!");
System.out.println("---------------------------");
}
public void description(){
System.out.println("我是最弱的机枪!");
System.out.println("---------------------------");
}
};
break;
}
case 2:{
w = new Weapon(){//选择大炮时,重写武器的方法
public void fire(){
System.out.println("大炮射击!!!");
System.out.println("---------------------------");
}
public void description(){
System.out.println("我是老二,大炮!!");
System.out.println("---------------------------");
}
};
break;
}
case 3:{
w = new Weapon(){//选择导弹时,重写武器的方法
public void fire(){
System.out.println("导弹发射!!!");
System.out.println("---------------------------");
}
public void description(){
System.out.println("我是最威猛的导弹!!!");
System.out.println("---------------------------");
}
};
break;
}
case 4:{
flag = false;
break;
}
default:{
System.out.println("没这种选择");
}
}
if (flag){
s.install(w);
attack();
}
}
}
//攻击
public void attack(){
while (check){
System.out.println("1.射击 2.换武器 3.退出");
String str = sc.next();
int choose = Integer.parseInt(str);
switch (choose){
case 1:{
s.shoot();
break;
}
case 2:{
start();
break;
}
case 3:{
check = false;
flag = false;
break;
}
default:{
System.out.println("输入错误!");
}
}
}
}
public static void main(String args[]){
new Start().start();
}
}
4名称:1000w能花多久? 知识点:内部类、继承、super
题目:大家都只能花爷爷的钱,如图,要花多久?每一次循环一个月。
黑色的线:继承关系 蓝色的线:内部类关系
参考程序:明天公布~
package roy;
/*
族谱
1.继承的设计
2.内部类的使用
3.向上转型
*/
public class MultExtend{
public void shopping(){
//向上转型
Grandpa[] pa_card= {
new Father(),new Son(),new GrandSon(),new GrandDaugther(),
new Daugther3()
};//use
Father.Mother.Brother[] brother_card={new BrotherSon(),
new BrotherGrandDaugther()
};//spent
int count=0;
//不知道要循环多少次,所以使用while
while(true){
count++;
//4 pa,brothers ,mother,brother
for(int i=0;i
2011.8.16
PS: 此题目可以使用一个内部类的特性,然后简化。内部类可以直接使用外部类的父类里面的方法。
内部类的特性总结
1.间接实现多继承、2.内部类可以使用外部类的方法、3.内部类可以使用外部类的父类的方法、4.外部类需要实列化内部类才可以使用内部类里面的方法、5.内部类和外部类的关系(会把同一类型的类、数据、内容放捆绑在一起)
5.题目:ArrayList的底层代码的接口实现 知识点:数组、重载、逻辑
package roy;
import java.util.*; interface MyListIf{ /* 1.使用数组实现下面方法 定义一个指定大小的数组 数组大小可以变化的 System.arraycopy(); */ public boolean add(Object obj); public Object get(int i); public void remove(int i);//根据下标删除对象 public void remove(Object obj); public void clear(); public void addAll(Collection col); } class MyList implements MyListIf{ //定义指定大小的数组 private int objSize=0; //默认的自增量 private int cap =10; //默认的数组大小 private int init=20; //因为我们创建一个数组,会分配一个连续的存储空间 private Object[] objs = new Object[init]; //构造器 public MyList(){ } //可以在创建的时候指定自增的大小 public MyList(int cap){ this.cap=cap; } //可以指定初始化的大小和递增的大小 public MyList(int init,int cap){ this.cap=cap; this.init=init; } public boolean add(Object obj){ //当元素的个数和数组的大小一样的时候,则应该递增 10 //当元素的个数等于数组的大小的时候,数组的大小应该递增10 if(objSize==objs.length){ Object[] temp=new Object[objs.length+cap]; System.arraycopy(objs,0,temp,0,objs.length); objs=temp; } objs[objSize]=obj; objSize++; return true; } public Object get(int index){ //{1,2,3,4,5,6,7} 20 if(index>objSize){ //手动抛出异常 throw new ArrayIndexOutOfBoundsException(); } return objs[index]; } public int size(){ return objSize; } //返回当前集合占用的空间长度 public int length(){ return this.objs.length; } public static void show(Object[] obj){ for(int i=0;i
objs =temp;
}//根据下标删除对象 public void remove(Object obj){ for(int i=0;i
public static void main(String args[]){ MyList list = new MyList(); for(int i=1;i<10;i++){ list.add("roy"+i); } list.remove("roy2"); List list2 = new ArrayList(); list2.add(11);list2.add(11);list2.add(11);list2.add(11); list2.remove(3); //list.addAll(list2); for(int i=0;i
}
6.题目:使用List实现多类型排序 知识点:集合、排序、比较器
在线电影
电影: 名称、简介、主演、导演、上映时间、票房、评分、评论、热度
排序:
按照上映时间排序、降序
按照票房、降序
按照评分高低、降序
按照导演名称排序
按照主演名称排序
要求:
15部电影
Collection.sort
Comparable
Comparator
匿名内部类
参考程序
package com.rayco;
import java.util.Date;
class Movie implements IMovie{
//类型,上演的时间,推荐率,点击率,名字,导演,主演
public int id;
public String name;//名字
public String type;//类型
public Date date;//时间
public String performer;//主演
public String guider;//导演
public int clickRate;//点击率
public int recommendRate;//推荐率
public Movie(){}
public Movie(int id,String name,String type,Date date,String performer,String guider,int clickRate,int recommendRate){
this.id=id;
this.name=name;
this.type=type;
this.date=date;
this.performer=performer;
this.guider=guider;
this.clickRate=clickRate;
this.recommendRate=recommendRate;
}
public String toString(){
return this.id+". 电影:"+this.name+"--"+"上映时间:"+this.date.toLocaleString().split("[ ]")[0]+"\n类型:"+this.type+"\n主演:"+performer+"--导演:"+this.guider+"\n(点击:"+this.clickRate+"--推荐:"+this.recommendRate+")";
}
}
package roy;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
//电影平台
public class MoviePlatform{
List movies=new ArrayList();//电影集合
public static Scanner sc=new Scanner(System.in);
public static int index=1;//记录电影的当前id
public static int SORT_BY_NAME=1;//根据名字排序
public static int SORT_BY_TYPE=2;
public static int SORT_BY_DATE=3;
public static int SORT_BY_CLICKRATE=4;
public static int SORT_BY_RECOMMENDRATE=5;
//菜单
public void mainMenu(){
boolean flag=true;
while(flag){
System.out.println("1.查看电影 2.上传电影 3.删除电影 4.退出系统");
choose(sc.nextInt());
}
}
public void choose(int choice){
switch(choice){
case 1:{
printAll(movies);
System.out.println("1.按名字排序 2.按类型排序 3.按上映时间排序 4.按点击率 5.按推荐率 6.返回上级");
System.out.println("请选择:");
choose2(sc.nextInt());
break;
}
case 2:{
System.out.println("输入电影名称:");
String name=sc.next();
System.out.println("输入电影类型:");
String type=sc.next();
System.out.println("输入电影主演:");
String performer=sc.next();
System.out.println("输入电影导演:");
String guider=sc.next();
System.out.println("输入电影上映时间(eg: 2010/09/05 )");
String date=sc.next();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
try {
Date d=sdf.parse(date);
//创建电影
IMovie movie=new Movie(index,name,type,d,performer,guider,0,0);
add(movie);
index++;
} catch (ParseException e) {
e.printStackTrace();
System.out.println("*****输入时间格式错误*****");
}
break;
}
case 3:{
System.out.println("输入电影的id:");
int id=sc.nextInt();
try{
deleteById(id-1);
System.out.println("删除成功!");
}catch(Exception ex){
System.out.println("不存在该电影!");
}
break;
}
case 4:{
System.exit(1);
}
}
}
public void choose2(int choice){
switch(choice){
case 1:{
sort(MoviePlatform.SORT_BY_NAME);
printAll(movies);
choose3();
break;
}
case 2:{
sort(MoviePlatform.SORT_BY_TYPE);
printAll(movies);
choose3();
break;
}
case 3:{
sort(MoviePlatform.SORT_BY_DATE);
printAll(movies);
choose3();
break;
}
case 4:{
sort(MoviePlatform.SORT_BY_CLICKRATE);
printAll(movies);
choose3();
break;
}
case 5:{
sort(MoviePlatform.SORT_BY_RECOMMENDRATE);
printAll(movies);
choose3();
break;
}
case 6:{
break;
}
}
}
public void choose3(){
System.out.println("1.观看影片 2.推荐影片 3.返回顶级");
System.out.println("请选择:");
int choice=sc.nextInt();
if(choice==1){
System.out.println("-->选择电影,输入电影id:");
int id=sc.nextInt();
boolean flag=clickMovie(id);
if(!flag)
System.out.println("*****不存在该电影*****");
}else if(choice==2){
System.out.println("-->选择电影,输入电影id:");
int id=sc.nextInt();
boolean flag=introduceMovie(id);
if(!flag)
System.out.println("*****不存在该电影*****");
}
}
//点击观看影片
public boolean clickMovie(int id){
try{
Movie movie=(Movie)movies.get(id-1);
System.out.println("*****"+movie.name+" 非常精彩,看得神魂颠倒*****");
movie.clickRate+=1;//点击量加 1
}catch(Exception ex){
ex.printStackTrace();
return false;
}
return true;
}
//推荐电影
public boolean introduceMovie(int id){
try{
System.out.println("你是否推荐此片给广大网友?-- y/n");
String answer=sc.next();
if(answer.equals("y")){
System.out.println("****您推荐了此片*****");
Movie movie=(Movie)movies.get(id-1);
movie.recommendRate+=1;//推荐值加 1
}else{
System.out.println("*****纯粹打酱油路过的*****");
}
}catch(Exception ex){
ex.printStackTrace();
return false;
}
return true;
}
//上传电影
public void add(IMovie movie){
this.movies.add(movie);
}
//删除影片
public void deleteById(int id){
this.movies.remove(id);
}
//打印所有影片
public void printAll(List list){
for(int i=0;im2.name.hashCode())
return 1;
else if(m1.name.hashCode()==m2.name.hashCode())
return 0;
else
return -1;
}
});
}else if(sort==MoviePlatform.SORT_BY_TYPE){
Collections.sort(movies,new Comparator(){
public int compare(Object o1,Object o2){
Movie m1=(Movie)o1;
Movie m2=(Movie)o2;
if(m1.type.hashCode()>m2.type.hashCode())
return 1;
else if(m1.type.hashCode()==m2.type.hashCode())
return 0;
else
return -1;
}
});
}else if(sort==MoviePlatform.SORT_BY_DATE){
Collections.sort(movies,new Comparator(){
public int compare(Object o1,Object o2){
Movie m1=(Movie)o1;
Movie m2=(Movie)o2;
return m1.date.compareTo(m2.date);
}
});
//匿名内部类实现不同的排序功能
//1.特殊性,movie这个pojo在这里根据不同的情况实现不同的排序
//compare方法的重写。节省了大量代码
}else if(sort==MoviePlatform.SORT_BY_CLICKRATE){
Collections.sort(movies,new Comparator(){
public int compare(Object o1,Object o2){
Movie m1=(Movie)o1;
Movie m2=(Movie)o2;
if(m1.clickRate>m2.clickRate)
return 1;
else if(m1.clickRate==m2.clickRate)
return 0;
else
return -1;
}
});
}else if(sort==MoviePlatform.SORT_BY_RECOMMENDRATE){
Collections.sort(movies,new Comparator(){
public int compare(Object o1,Object o2){
Movie m1=(Movie)o1;
Movie m2=(Movie)o2;
if(m1.recommendRate>m2.recommendRate)
return 1;
else if(m1.recommendRate==m2.recommendRate)
return 0;
else
return -1;
}
});
}
return movies;
}
public static void main(String args[]){
MoviePlatform form=new MoviePlatform();
form.mainMenu();
}
}
参考程序2
package shuang;
import java.util.*;
public class Movie2 {
private String name;//影片名字
private String type;//影片类型
private String direct;//导演
private int time;//上映时间
private int recommend_rate;//推荐率
private int click_rate;//点击率
private String lead;//主角
public Movie2(){}
public Movie2(String name,String type,String direct,int time,int recommend_rate,int click_rate,String lead){
this.name=name;
this.type=type;
this.direct=direct;
this.time=time;
this.recommend_rate=recommend_rate;
this.click_rate=click_rate;
this.lead=lead;
}
public String getName(){
return this.name;
}
public String getType(){
return this.type;
}
public int getTime(){
return this.time;
}
public int getRecommend_rate(){
return this.recommend_rate;
}
public int getClick_rate(){
return this.click_rate;
}
public String toString(){
return "电影:"+this.name+" 类型:"+this.type+"上映时间:"+this.time+" 导演:"+this.direct+" 主角:"+lead+" 点击率:"+click_rate+"% 推荐率:"+this.recommend_rate+"% ";
}
}
class MovieTest{
ArrayList list = new ArrayList();
//Iterator it = list.iterator();
public void addMovie(){
list.add(new Movie2("枪王之王","科幻","尔冬升",100723,90,95,"古天乐"));
list.add(new Movie2("线人","动作","林超贤",100830,85,97,"谢霆锋"));
list.add(new Movie2("全城戒备","科幻","陈木胜",100619,93,99,"郭富城"));
}
public void printAll(){
for(int i=0;imovie2.getType().hashCode()){
return 1;
}
else if (movie1.getType().hashCode()movie2.getTime())
{
return 1;
}
else if (movie1.getTime()movie2.getClick_rate()){
return 1;
}
else if (movie1.getClick_rate()movie2.getRecommend_rate()){
return 1;
}
else if (movie1.getRecommend_rate()
7.题目: 一个岛上30个人,其中15个教徒和15五个非教徒,这30个人手拉手围成一圈,从第1个人开始数到9,第9个是非教徒,将其推入海中,接着又从下一个人开始数到第9个人,将其推入海中,即是说,每数到第个9人时,该人恰好为非教徒,请问这15个非教徒如何排序?
知识点: 链表、算法
参考程序 1
package roy;
import java.util.LinkedList;
public class Search {
public static void main(String[] args) {
LinkedList lList = new LinkedList();
//Numbers用于记录15个非教徒的号码牌
int [] Numbers ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for(int i=0;i<30;i++){
//分配号码牌
Person p = new Person(i+1);
lList.add(p);
}
for(int m=0,n=0;m<15;m++){
n=n+8;//每个异教徒相隔8个人
//通过不断变化的总人数来寻找。记住,不管人数如何变化,我们都是
//从下一个开始的第9个人.也就是相隔8个人
n=n%(lList.size());//寻找下一个非教徒的位置
Numbers[m]=((Person)lList.get(n)).getNumber(); //取出非教徒的号码牌
lList.remove(n);//将非教徒推入海中
}
for(int i =0;i<15;i++){
System.out.print(Numbers[i]);
System.out.print(" ");
}
}
}
参考程序2
package roy;
import java.util.*;
public class People{
List persons=new LinkedList();//教徒列表
List answer=new LinkedList();
//初始化人
public Test(){
for(int i=0;i<30;i++){
persons.add(new Person(i+1));
}
}
public void start(){
System.out.println("开始推人:");
for(int m=0,n=0;m<15;m++){//总共15个非教徒,必须一个一个找
n=n+8;//n每次加8,因为下标相隔8
n=n%(persons.size());
Person p=persons.get(n);
System.out.print(p.id+"--下海--");
answer.add(p);//这里的人是个非教徒,记录下来
persons.remove(n);//推下海,从list中移除掉
}
}
//判断是否已被推入海
public void print(){
System.out.println("\n*****教徒的位置如下:");
Collections.sort(answer,new Comparator(){
public int compare(Object o1,Object o2){
Person p1=(Person)o1;
Person p2=(Person)o2;
if(p1.id>p2.id)
return 1;
else if(p1.id==p2.id)
return 0;
else
return -1;
}
});
for(int i=0;i