3.1. 顺序容器
能存储需求、不限制能存储的记录的数量、能知道已经存储的记录的数量、能查看存进去的每一条记录、能删除一条记录、能列出所有的记录
接口设计:
arraylist:范型容器
ArrayList<String> notes=new ArrayList<String>();容器类有两个类型:容器的类型、元素的类型
ArrayList有顺序的,下标索引从0开始。ArrayList的操作
public class NoteBook { private ArrayList<String> notes=new ArrayList<String>(); public void add(String s) { //ArrayList的add方法 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); } public void removeNote(int index) { notes.remove(index); } public String[] list() { String[] a=new String[notes.size()]; /*for (int i = 0; i < notes.size(); i++) { a[i]=notes.get(i); }*/ notes.toArray(a); return a; } public static void main(String[] args) { // TODO Auto-generated method stub String[] aStrings=new String[2]; aStrings[0]="first"; aStrings[1]="second"; NoteBook noteBook=new NoteBook(); noteBook.add("first"); noteBook.add("second"); noteBook.add("third",1); System.out.println(noteBook.getSize()); System.out.println(noteBook.getNote(0)); System.out.println(noteBook.getNote(1)); noteBook.removeNote(1); String[] a=noteBook.list(); for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } } }
3.2. 对象数组
foreach循环
class Value{ private int i; public void set(int i) {this.i=i;} public int get() {return i;} }
public static main(){
Value[] aValues=new Value[10]; for (int i = 0; i < aValues.length; i++) { aValues[i]=new Value(); aValues[i].set(i); } for (Value v : aValues) { System.out.println(v.get()); }}
此时程序输出0,1,2,3,4,5,6,7,8,9,
Value[] aValues=new Value[10]; for (int i = 0; i < aValues.length; i++) { aValues[i]=new Value(); aValues[i].set(i); } for (Value v : aValues) { System.out.println(v.get()); v.set(0); } for (Value v : aValues) { System.out.println(v.get()); }则此时程序输出0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0
此时foreach循环中,每个v相当于复制了数组中的a[i],也是对象的管理者,所以可以对对象进行操作。foreach也应用于arraylist集合。
3.3. 集合容器(Set)
集合就是数学中的集合的概念:所有的元素都具有唯一的值,元素在其中没有顺序。使用方法与arraylist类似,与此相比则集合中元素唯一且无序只要在Java类中声明定义public String toString 的方法,则在printf中可直接使用类对象,会自动调用你定义的toString方法。
ArrayList< String> arrayList=new ArrayList<String>(); arrayList.add("first"); arrayList.add("second"); arrayList.add("first"); System.out.println(arrayList); System.out.println("---------"); HashSet< String> set=new HashSet<String>(); set.add("first"); set.add("second"); set.add("first"); System.out.println(set);输出:
3.4.散列表(Hash)
传统意义上的Hash表,是能以int做值,将数据存放起来的数据结构。Java的Hash表可以以任何实现了hash()函数的类的对象做值来存放对象,hash表是以一对值进行存储的(key,value)coin对应:1美分(penny) 5美分(nickel)10美分(dime)25美分(quarter)50美分(half-dollar)查找应兵名称程序
public class Coin { private HashMap<Integer, String> coinnames=new HashMap<Integer,String>(); public Coin() { // TODO Auto-generated constructor stub coinnames.put(1, "penny"); coinnames.put(10, "dime"); coinnames.put(25, "quarter"); coinnames.put(50, "half-dolar"); coinnames.put(50,"*"); System.out.println(coinnames.keySet().size()); System.out.println(coinnames); } public String getName(int amount) { if (coinnames.containsKey(amount)) { return coinnames.get(amount); }else { return "NOT FOUND"; } } public static void main(String[] args) { // TODO Auto-generated method stub java.util.Scanner in=new java.util.Scanner(System.in); int amount=in.nextInt(); Coin coin=new Coin(); String name =coin.getName(amount); System.out.println(name); } }
for (Integer k : coinnames.keySet()) { String string=coinnames.get(k); System.out.println(string); }
3.5.练习:查找里程
你的程序要读入这样的一张表,然后,根据输入的两个城市的名称,给出这两个城市之间的里程。
输入格式:
首先,你会读到若干个城市的名字。每个名字都只是一个英文单词,中间不含空格或其他符号。当读到名字为“###”(三个#号)时,表示城市名字输入结束,###并不是一个城市的名字。如果记读到的城市名字的数量为n。
然后,你会读到nxn的一个整数矩阵。第一行的每一个数字,表示上述城市名单中第一个城市依次到另一个城市之间的里程。表中同一个城市之间的里程为0。
最后,你会读到两个城市的名字。
输出格式:
输出这两个城市之间的距离。
class FindMileage { private java.util.HashMap<String, Integer> map=new java.util.HashMap<String,Integer>(); private int [][] Mileage; private static java.util.Scanner in=new java.util.Scanner(System.in); public int getValue(String key) { return map.get(key); } public void input() { int count=0; while(true) { String temp=in.next(); if (temp.equals("###") == true) { break; } map.put(temp, count); count++; } Mileage=new int[ map.keySet().size()][ map.keySet().size()]; for (int i = 0; i < Mileage.length; i++) { for (int j = 0; j < Mileage.length; j++) { Mileage[i][j]=in.nextInt(); } } } public static void main(String[] args) { // TODO Auto-generated method stub FindMileage findMileage=new FindMileage(); findMileage.input(); int start=findMileage.getValue(in.next()); int end=findMileage.getValue(in.next()); int result=findMileage.Mileage[start][end]; System.out.println(result); in.close(); } }