3.1 顺序容器
3.1.1 java 记事本
要求:
(1)、存记录
(2)、 不能限制能存储的记录的数量
(3)、 能知道已经存储的记录的数量
(4)、 能查看存进去的每一条记录
(5)、 能删除一条记录
(6)、 能列出所有的记录
接口设计:
(1)、add(String note);
(2)、getSize();
(3)、getNote(int index);
(4)、removeNote(int index);
(5)、list();
/**
* 记事本-后端代码
*/
package notebook; //在notebook这个包中
import java.util.ArrayList;//调用工具类中的ArrayList容器
public class NoteBook { //NoteBook 类
private ArrayList<String> notes = new ArrayList<String>();
//泛型类 用来存放String的ArrayList类
//泛型类是一种容器
public void add(String s) { //增加
notes.add(s); //将东西放入这个容器
}
public void add(String s,int location) { //插入
notes.add(location, s); //在容器中的某一条前插入一条信息
}
public int getSize() { //获取长度
return notes.size(); //返回容器中备忘信息的条数
}
public String getNote(int index) { //查看某条记实录
return notes.get(index) ; //返回ArrayList中第index条消息信息
}
public void removeNote(int index) { //删除某条
notes.remove(index); //删除第index条信息
}
public String[] list() { //展示所有备忘录
String[] a = new String[notes.size()];
notes.toArray(a);
/**
以正确的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。返回的数组将是“安全的”,因为 此列表不维护对它的引用。
(换句话说,这个方法必须分配一个新数组)。 因此,调用者可以自由修改返回的数组。此方法充当基于数组的 API 和基于集合的 API 之间的桥梁。
指定者:List 中的 toArray(),覆盖:AbstractCollection 中的toArray()
返回:包含此列表中所有元素的数组,顺序不正确
**/
return a;
}
public static void main(String[] args) {//程序的入口
// TODO Auto-generated method stub
NoteBook nb = new NoteBook(); //创建对象
nb.add("ahdja"); //增加备忘录
nb.add("duiq");
System.out.println(nb.getSize()); //展示条数
nb.add("bdhja",1);
System.out.println("***********************");//分割线,便于直观的查看结果
System.out.println(nb.getNote(0));
System.out.println(nb.getNote(1));
System.out.println(nb.getNote(2));
nb.removeNote(1);
System.out.println("**********************");
String[] a = nb.list(); //创建String数组,将所有备忘录放进这个数组中
for(String s :a) { //for-each 将所有备忘信息打印出来
System.out.println(s); //输出
}
System.out.println("****************");//分割
}
}
1、 接口
2、 容器类
//其中一种
ArrayList<String> notes = new ArrayList<String>;
//用来存放对象
(1)、 容器类有两个类型
.容器的类型
.元素的类型
数组可以看作是一种容器,但是数组的元素个数一旦确定就无法改变,这在实际使用中是很大的不足。一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。在面向对象语言中,这种数据结构本身表达为一个对象。所以才有“放东西的东西”的说法。
3.2 对象数组
3.2.1 对象数组
当数组的元素的类型是类的时候,数组的每一个元素其实只是对象的管理者而不是对象本身。因此,仅仅创建数组并没有创建其中的每一个对象!
public static void main(String[] args){ //程序的入口
int[] ia = new int[10]; //int型数组,名称为ai,长度为10
String[] a = new String[10]; //String型数组,名称为a,长度为10
for(int i=0;i<a.length;i++){ //将0-9这几个数依次放入a这个数组中
a[i]=""+i;
}
System.out.println(ia[0]+2); //输出ia这个数组 第0位置上所管理的值与2相连 所组成的值
System.out.println(a[0].length()); //输出a这个数组的第0位所管理的字符串的长度
System.out.println(a[0]);//输出a这个数组的第0位置所管理的字符串
} //输出:2 1 0
对象数组中的每个元素都是对象的管理者而非对象本身。
3.2.2 for-each
/** for-each
for(int k :ia){ //打印数组中每一个元素
System.out.println(k); //将ia这个数组所管理的值依次打印出来
}
**/
public class Value {
private int i; //成员变量
public void set(int i) { //成员函数
this.i =i; // 将传入的值赋给成员变量
}
public int get() { //获取这个i的值
return i; //返回i值
}
public static void main(String[] args) { //程序的入口
// TODO Auto-generated method stub
Value[] a = new Value[10]; //创建数组
for(int i =0;i<a.length;i++) {
a[i]=new Value(); //创建对象 让a这个数组中的每一个下标去管理某一个值
a[i].set(i); //将这个值存储进去(有点抽象)
}
for(Value v : a) {
System.out.println(v.get()); //先输出了v中的值,a[0]指向(管理)了v1这个值,
v.set(0);//后将v中的值替换为0
}
for(Value v : a) { //将替换后的值输出
System.out.println(v.get());
}
}
}
//输出:0 1 2 3 4 5 6 7 8 9
// 0 0 0 0 0 0 0 0 0 0
(用鼠标画的,还请见谅)
3.3 集合容器(Set)
集合就是数学中的集合的概念:所有的元素都具有唯一的值,元素在其中没有顺序。
HashSet<String> s = new HashSet<String>();//集合
//集合中的元素是各不相同的
s.add("sdb");
s.sdd("hbdiw");
s.add("sdb");
System.out.println(s);// 打印容器中的信息
/**
*输出:
*[hbdiw,sdb]
**/
/*********************************************************************/
//toString
class Value{
private int i;
public void set(int i) {
this.i =i;
}
public int get() {
return i;
}
public String toString(){ //没有这个,输出为:notbook.Value@22998b08
return ""+ i;//把i变成字符串
}//任何一个java类,public返回是String的会自动调用toString函数
public static void main(String[] args) {
Value a = new Value();
v.set(10);
System.out.println();
// 输出: 10
}
}
3.4 散列表(Hash)
传统意义上的Hash表,是能以int做值,将数据存放起来的数据结构。Java的Hash表可以以任何实现了hash()函数的类的对象做值来存放对象。
Hash表是非常有用的数据结构,熟悉它,充分使用它,往往能起到事半功倍的效果。
/**
* 优雅永不过时
*
*/
package notebook;
import java.util.HashMap;//调用工具类中的HashMap容器
import java.util.Scanner;//
public class Coin {
private HashMap<Integer,String>coinnames = new HashMap<Integer,String>();//HashMap容器
public Coin() {
coinnames.put(1,"penny");//初始化
coinnames.put(10,"dime");
coinnames.put(25,"quarter");
coinnames.put(50,"half-dolor");
coinnames.put(50,"五毛");
// System.out.println(coinnames.keySet().size());
// System.out.println(coinnames);
//
// for(Integer k : coinnames.keySet()) {//遍历Coin
// String s =coinnames.get(k);
// System.out.println(s);
// }
}
public String getName(int amount) { //输入金额,获取名字
if(coinnames.containsKey(amount)) { //有则输出,无则NOT FOUND
return coinnames.get(amount);
}else {
return "NOT FOUND";
}
}
public static void main(String[] args) { //程序的入口
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("请输入金额:");
int amount = in.nextInt(); //输入金额
Coin coin = new Coin(); //创建对象
String name = coin.getName(amount); //将获得的名称存入name这个字符串中,然后打印
System.out.println(name);
}
}