JAVA面向对象编程学习 (3)对象容器

容器

所谓容器,就是“放东西的东西”。数组可以看作是一种容器,但是数组的元素个数一旦确定就无法改变,这在实际使用中是很大的不足。一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。在面向对象语言中,这种数据结构本身表达为一个对象。所以才有“放东西的东西”的说法。

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();
	}
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值