认识Java的API—使用Java函数库
Java内置有数百个类
1.数组不够用的时候—ArrayList
其实真的有这样的集合,但它不是数组,而是整个ArrayList。它是Java函数库中的另一个类。
ArrayList方法:
1)add(Object elem):向list中加入对象参数
2)remove(int index):在索引参数中移除对象
3)remove(Object elem):移除该对象
4)contains(Object elme):如果和对象参数匹配返回"true"
5)isEmpty():如果list中没有元素返回"true"
6)indexOf(Object elme):返回对象参数的索引或-1
7)size():返回list中元素的一个数
8)get(int index):返回当前索引参数的对象
2.ArrayList的操作
1)创建
ArrayList myList = new ArrayList();//新的ArrayList对象会创建在堆上
2)加入元素
Egg s = new Egg();
myList.add(s);
3)再加入元素
Egg d = new Egg();
myList.add(d);
4)查询大小
int theSize = myList.size();
5)查询特定元素的位置
int idx = myList.indexOf(d);
6)查询特定元素
boolean isIn = myList.contains(s);
7)判断集合是否为空
boolean empty = myList.isEmpty();
8)删除元素
myList.remove(s);
3.ArrayList与一般数组的比较
1)一般数组在创建时就必须确定大小,ArrayList不需要指定大小
eg:new String[2]
new ArrayList()
2)存放对象给一般数组时必须指定位置(必须要指定介于0到length-1之间的位置),ArrayList不需要指定索引值
eg:myList[1]=b
3)一般数组使用特殊的语法,ArrayList没有特殊的语法
eg:myList[1]
4)在Java5.0中的ArrayList是参数化的(parameterized)
eg:ArrayList,是类型参数。这代表String集合,就像说ArrayList代表Dog的集合。
4.开发真正的"Sink a Dot Com"游戏
游戏目标:以最少的猜测次数打掉计算机所安排的达康(Dot Com)网站。计算机会根据你的表线来评分。
初始设置:程序启动后,计算机会在虚拟的7*7方格上安排3个达康网站。安排完成后,游戏会要求你开始猜坐标。
进行游戏:猜测的位置(格子),你会输入"A3"或者"C5"等。计算机会回给你命中"Hit"、没中"Miss"或击沉"Sunk"等回应。当你清空所有的达康时,
游戏会列出你的分数并结束。
DotComBust类有3个主要的任务:启动游戏,进行游戏直到所有的DotCom都被击沉为止,以及结束游戏。虽然我们可以将这3个任务直接用3个方法
来对应,但我们还是将进行游戏的工作分割成两个方法以便保持较小的功能模块。较小的功能模块比较好测试、除错与修改。
import java.util.ArrayList;
public class DotCom {
//DotCom的实例变量保存位置的ArrayList
private ArrayList<String> locationCells;
//DotCom的名称
private String name;
//更新DotCom位置的setter方法
public void setLocationCells(ArrayList<String> loc){
locationCells = loc;
}
public void setName(String n) {
name = n;
}
public String checkYourself(String userInput){
String result = "miss";
//判断玩家猜测值是否有出现在ArrayList中,没有的话会返回-1
int index = locationCells.indexOf(userInput);
//如果索引值大于等于0,命中!
if(index>=0){
//删除已经命中的格子
locationCells.remove(index);
//如果全部命中清空,那就表示击沉了
if(locationCells.isEmpty()){
result="kill";
System.out.println("Ouch! You sunk "+name+" :(");
}else{
result="hit";
}
}
//返回状态
return result;
}
}
import java.util.ArrayList;
public class DotComBust {
//声明并初始化变量
private GameHelper helper = new GameHelper();
private ArrayList<DotCom> dotComList = new ArrayList<DotCom>();
private int numOfGuesses = 0;
//创建3个DotCom对象并指派名称并置入ArrayList
private void setUpGame(){
DotCom one = new DotCom();
one.setName("Pets.com");
DotCom two = new DotCom();
one.setName("eToys.com");
DotCom three = new DotCom();
one.setName("Go2.com");
dotComList.add(one);
dotComList.add(two);
dotComList.add(three);
System.out.println("Your goal is to sink three dot coms.");
System.out.println("Pets.com,eToys.com,Go2.com");
System.out.println("Try to sink them all in the fewest number of guesses");
//对list中所有的DotCom重复
for(DotCom dotComToSet :dotComList){
//要求DotCom的位置
ArrayList<String> newLocation = helper.placeDotCom(3);
//调用这个DotCom的setter方法来指派刚取得的位置
dotComToSet.setLocationCells(newLocation);
}
}
private void startPlaying(){
//判断DotCom的list是否为空
while(!dotComList.isEmpty()){
//取得玩家输入
String userGuess = helper.getUserInput("Enter a guess");
//调用checkUserGuess方法
checkUserGuess(userGuess);
}
//调用finishGame方法
finishGame();
}
private void finishGame() {
System.out.println("All Dot Coms are dead! Your stock is now worthless.");
if(numOfGuesses<=18){
System.out.println("It only took you"+ numOfGuesses + " guesses.");
System.out.println("You got out before your options sank.");
}else{
System.out.println("Took you long enough. "+ numOfGuesses + " guesses.");
System.out.println("Fish are dancing with your options");
}
}
private void checkUserGuess(String userGuess) {
//递增玩家猜测次数的计数
numOfGuesses++;
//先假设没有命中
String result = "miss";
//对list中所有的DotCom重复
for(DotCom dotComToTest:dotComList){
//要求DotCom检查是否命中或击沉
result = dotComToTest.checkYourself(userGuess);
if(result.equals("hit")){
//提前跳出循环
break;
}
if(result.equals("kill")){
//击中就删除
dotComList.remove(dotComToTest);
}
}
//列出结果
System.out.println(result);
}
public static void main(String[] args) {
//创建游戏对象
DotComBust game = new DotComBust();
//要求游戏对象启动
game.setUpGame();
//要求游戏对象启动游戏的主要循环
game.startPlaying();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
//从命令行取得输入
public class GameHelper {
private static final String alphabet = "abcdefg";
private int gridLength = 7;
private int gridSize = 49;
private int[] grid = new int[gridSize];
private int comCount = 0;
public String getUserInput(String prompt){
String inputLine = null;
System.out.print(prompt+" ");
try{
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
inputLine = is.readLine();
if(inputLine.length()==0) {
return null;
}
}catch (IOException e){
System.out.println("IOException:"+e);
}
return inputLine.toLowerCase();
}
public ArrayList<String> placeDotCom(int comSize){
ArrayList<String> alphaCells = new ArrayList<String>();
//保存字符串
String[] alphacoords = new String[comSize];
//临时字符串
String temp = null;
//现有字符串
int[] coords = new int[comSize];
//目前测试字符串
int attempts = 0;
//找到合适位置
boolean success = false;
//目前起点
int location = 0;
//现在处理到第n个
comCount++;
//水平增量
int incr = 1;
//如果是单数号的
if((comCount%2)==1){
incr = gridLength;
}
//主要搜索循环
while(!success & attempts++ <200){
//随机起点
location = (int)(Math.random()*gridSize);
System.out.println("try "+location);
//第n个位置
int x = 0;
//假定成功
success = true;
//查找未使用的点
while(success && x<comSize){
//如果没有使用
if(grid[location]==0){
//存储位置
coords[x++] = location;
//尝试下一个点
location += incr;
//超出下边缘
if(location>=gridSize){
//失败
success=false;
}
//超出右边缘
if(x>0 && (location % gridLength==0)){
success=false;
}
}else{
//找到已使用的位置
//System.out.println("used "+location);
success=false;
}
}
}
//将位置转换成字符串的形式
int x = 0;
int row = 0;
int column = 0;
while(x<comSize){
//标识格子已用
grid[coords[x]]=1;
//得到行的值
row=(int)(coords[x]/gridLength);
//得到列的值
column = coords[x]%gridLength;
//转换成字符串
temp = String.valueOf(alphabet.charAt(column));
alphaCells.add(temp.concat(Integer.toString(row)));
x++;
//DotCom的确定位置
//System.out.print(" coord"+x+" = "+alphaCells.get(x-1));
}
// System.out.println("\n");
return alphaCells;
}
}
5.超强布尔表达式
1)"与"和"或"运算符(&&,||)
eg:如果价格范围在300与400之间,就选择X牌相机
if(price>=300 && price <400){
camera = "X";
}
eg:假如说有10种不同品牌的相机可供选择,你有这样的逻辑来限制品牌
if(brand.equals(“A”)||brand.equals(“B”)){
//执行A或B才能进行的工作
}
2)"不等于"运算符(!=和!)
eg:有一项规则仅适用于10台相机其中的1台
if(model!=2000){
//非model2000的工作
}
if(!brand.equals("X")){
//非X牌的工作
}
3)短运算符(&&,||)
像&&与||,这些我们已将看过的运算符都称为短运算符。在&&表达式中,左右两边都为true这个表达式才为true。在||表达式中,左右两边都为
false这个表达式才为false。
4)长运算符(&,|)
&与|运算符使用在boolean表达式时会强制Java虚拟机一定要计算运算符两边的算式。但这两个运算符通常是用来作位的运算。
6.使用函数库(Java API)
1)在Java的API中,类是被包装在包中。
2)要使用API中的类,你必须知道它被放在哪个包中。
在使用的时候得注意:在程序的某个地方你必须要指明函数库类的完整名称,也就是包的名称加上类名。
3)你必须指明程序代码中所使用的类的完整名称
原因:(1)可以帮助组织项目或函数库相对于一大堆零散的类,以功能来组织会比较好。
(2)包可以制造出名称空间,以错开相同名称的类。
(3)包可以通过限制同一包之间的类才能相互存取以维护安全性。
eg:java.util.ArrayList
你必须告诉Java想要使用的是哪一个ArrayList。有两种方法可以指定:
(1)import:放一个import述句在程序源文件的最前面
eg:import java.util.ArrayList;
(2)Type:在程序代码中打出全名。不管在哪里,只要有使用到就打出全名
eg:声明的时候
java.util.ArrayList<Dog> list = new java.util.ArrayList<Dog>();
eg:用在参数的时候
public void go(java.util.ArrayList<Dog> list){}
eg:作为返回类型的时候
public java.util.ArrayList<Dog> foo(){}
7.要点
1)ArrayList是个Java API的类
2)使用add()来新增ArrayList的元素
3)使用remove()来删除ArrayList中的元素
4)要寻找某项元素的位置,使用indexOf()
5)使用isEmpty()来判别ArrayList是否为空
6)要取得ArrayList的大小,可以使用size()方法
7)传统的数组可以用length这个变量取得大小
8)ArrayList会自动地调整大小
9)你可以用参数类型来声明数组内容的类型,例如ArrayList会声明带有Button类型元素的ArrayList
10)虽然ArrayList只能携带对象而不是primitive主数据类型包装成Object以存放在ArrayList中
11)类会用包来组织
12)类有完整的名称,那是由包的名称与类的名称所组成的。ArrayList事实上叫做java.util.ArrayList
13)除了java.lang之外,使用到其他包的类都需要指定全名
14)也可以在原始程序代码的最开始部分下import指令来说明所使用到的包