容器
所谓容器,就是“放东西的东西”。数组可以看作是一种容器,但是数组的元素个数一旦确定就无法改变,这在实际使用中是很大的不足。一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。在面向对象语言中,这种数据结构本身表达为一个对象。所以才有“放东西的东西”的说法。
Java具有丰富的容器,Java的容器具有丰富的功能和良好的性能。熟悉并能充分有效地利用好容器,是现代程序设计的基本能力。
我们首先学习的是顺序容器,即放进容器中的对象是按照指定的顺序(放的顺序)排列起来的,而且允许具有相同值的多个对象存在。
在一些书中,将容器(英文为collection或container)翻译为“集合”,由于数学中的集合(Set)也是一种特定的容器类型,我们认为将collection翻译为集合是不恰当的。所以我们只会使用容器一词。
顺序容器
在类内定义容器的写法
private ArrayList<String> note =new ArrayList<String>();
一个简易的api说明
package notebook;
import java.util.ArrayList;
public class Notebook
{
private ArrayList<String> note =new ArrayList<String>();
public void add(String s)
{
note.add(s);
}
public int getSize()
{
return note.size();//real size
}
public String getNote(int index)
{
String string=new String();
if(index>note.size())
{
return "";
}
return note.get(index);
}
public void removeNote(int index)
{
note.remove(index);
}
public String[] list()
{
String [] a =new String [note.size()];
note.toArray(a);
/*
for(int i=0;i<note.size();i++)
{
a[i]=note.get(i);
}
*/
return a;
}
public static void main(String[] args)
{
}
}
对象数组
核心观点:当数组的元素的类型是类的时候,数组的每一个元素其实只是对象的管理者而不是对象本身。因此,仅仅创建数组并没有创建其中的每一个对象!
for-each
对于基础的for-each遍历数组(不包含对象数组,其产生出来的each指针是该元素的复制品,而不是真正的元素)。
但是在对象数组中,情况并非如此:
代码实验:
class Value
{
private int i;
public void set(int i)
{
this.i=i;
}
public int getVal()
{
return i;
}
}
Value [] a =new Value[10];//new出来10个对象数组的管理者
for(int i=0;i<a.length;i++)
{
a[i]=new Value();
a[i].set(i);
}
for(Value i:a)
{
System.out.println(i.getVal());
i.set(0);
}
for(Value i:a)
{
System.out.println(i.getVal());
}
也就是说这种模式下,他创建出来的这个管理者,照样会去管理对象,会直接改变它的值,有点像C里面的指针改变的感觉。
集合容器(SET)
集合就是数学中的集合的概念:所有的元素都具有唯一的值,元素在其中没有顺序。
集合是没有顺序的,所以集合里面的元素并没有位置这个概念,所以就不能用get()函数来获取某一个特定的元素
哈希表
传统意义上的Hash表,是能以int做值,将数据存放起来的数据结构。Java的Hash表可以以任何实现了hash()函数的类的对象做值来存放对象。
Hash表是非常有用的数据结构,熟悉它,充分使用它,往往能起到事半功倍的效果。
package notebook;
import java.util.*;
public class Coin {
//先定义接口,在写程序给人家
private HashMap<Integer,String> transHashMap=new HashMap<Integer,String>();
public Coin()
{
transHashMap.put( 1,"penny" );
transHashMap.put(10, "dime");
transHashMap.put(25, "t");
transHashMap.put(50, "hd");
//遍历输出方式
for(Integer k:transHashMap.keySet())
{
String string = transHashMap.get(k);
System.out.println(string);
}
}
public String getName(int amount)
{
if(transHashMap.containsKey(amount))
{
return transHashMap.get(amount);
}
else
{
return "can not find key name";
}
}
public static void main(String[] args)
{
java.util.Scanner in =new Scanner(System.in);
int amount=in.nextInt();
Coin coin=new Coin();
System.out.println(coin.getName(amount));
}
}
作业题
题目描述
你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程。
注意:任何两个城市之间的里程都已经给出,不需要计算经第三地中转。
注意:你并不需要去录入上图的数据,数据是在程序输入中给的。
输入格式:
首先,你会读到若干个城市的名字。每个名字都只是一个英文单词,中间不含空格或其他符号。当读到名字为“###”(三个#号)时,表示城市名字输入结束,###并不是一个城市的名字。如果记读到的城市名字的数量为n。
然后,你会读到nxn的一个整数矩阵。第一行的每一个数字,表示上述城市名单中第一个城市依次到另一个城市之间的里程。表中同一个城市之间的里程为0。
最后,你会读到两个城市的名字。
输出格式:
输出这两个城市之间的距离。
输入样例:
Hagzou Hugzou Jigxng ###
0 1108 708
1108 0 994
708 994 0
Hagzou Jigxng
输出样例:
708
解题思路
首先这道题是给出城市的名字,然后给出城市之间的信息(二维数组),然后进行一次查询输出。
那么关键就是如何存储城市之间的信息。由于城市名字与二维数组的index有对应关系的,而这在后面我们查询的时候有关联,因此我们需要特别注意这个问题
AC代码
import java.util.ArrayList;//引入容器
import java.util.Scanner;//引入扫描函数
//主类
public class Main{
public static void main(String[] args) {
City city = new City();//新建City类对象city
city.setDistance();//调用setDistance方法设置距离
city.getDistance();//调用getDistance方法输出距离
}
}
//City类
class City{
private ArrayList<String> city;//容器,存储城市名
private int distance[][];//二维数组,存储输入的距离矩阵
Scanner in = new Scanner(System.in);
//构造函数,初始化
public City() {
city=new ArrayList<String>();
String ctName=in.next();//输入城市名
//把城市名添加进容器
while(true) {
if(ctName.equals("###")) {
break;//如果输入的是“###”,停止添加城市名
}
city.add(ctName);//添加
ctName=in.next();//输入
}
//若输入n个城市,建立n*n大小距离矩阵
distance=new int[city.size()][city.size()];
}
//初始化距离矩阵
public void setDistance() {
int mile=0;
for(int i=0;i<distance.length;i++) {//行
for(int j=0;j<distance[i].length;j++) {//列
mile=in.nextInt();//输入距离
distance[i][j]=mile;//初始化对应坐标距离矩阵
}
}
}
//得到两城市之间的距离
public void getDistance() {
//输入起始城市名,并获取其在容器中的坐标
int start=city.indexOf(in.next());
//输入终点城市名,并获取其在容器中的坐标
int end=city.indexOf(in.next());
//根据起始和终点坐标在距离矩阵中找到两城市之间的距离
System.out.println(distance[start][end]);
}
}
package Map;
import java.util.ArrayList;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
City city=new City();
city.ScannIn();
city.Search();
}
}
class City
{
private int dis[][];
private ArrayList<String> city;
Scanner in=new Scanner(System.in);
public void ScannIn()
{
city=new ArrayList<String>();
while(true)
{
String string =new String();
string=in.next();
if(string.equals("###"))
{
break;
}
city.add(string);
//test
System.out.println(city.size()+":"+city.get(city.size()-1));
}
int n=city.size();
System.out.println("load all string! "+n);
//接着处理数组
}
public void Search()
{
System.out.println(city.size());
int mie=0;
dis=new int[city.size()][city.size()];
System.out.println(city.size());
for(int i=0;i<dis.length;i++)
{
for(int j=0;j<dis[i].length;j++)
{
mie=in.nextInt();
this.dis[i][j]=mie;
}
}
int start=city.indexOf(in.next());
int end=city.indexOf(in.next());
System.out.println(dis[start][end]);
in.close();
}
}