3.Java—对象容器

时间:2022-01-31 16:11:12

3.1. 顺序容器

记事本(简单)需求:(notebook)

能存储需求、不限制能存储的记录的数量、能知道已经存储的记录的数量、能查看存进去的每一条记录、能删除一条记录、能列出所有的记录

接口设计:

3.Java—对象容器

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. 对象数组

   3.Java—对象容器

当数组的元素的类型是类的时候,数组的每一个元素其实只是对象的管理者而不是对象本身。因此,仅仅创建数组并没有创建其中的每一个对象!

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.Java—对象容器

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);
	}
}
3.Java—对象容器
      hash表中只要key的值相同,则存在唯一。hash不能放入foreach中,遍历没有特别简单的方法,则需遍历key的集合。
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();
	}

}