Java进阶学习-3 容器类 对象数组 set HashMap


title: Java进阶学习-3 容器类 对象数组 set HashMap
date: 2020-02-01 22:10:26
tags: Java学习

记事本Demo

功能设计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TIA3yi3l-1580663767957)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201221246201.png)]

接口设计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QosKmRN7-1580663767958)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201221306790.png)]

之前我们写的程序 人机交互(输入输出部分) 业务逻辑(对输入进行计算的部分)都在一块 初学的时候为了表达方便所以写在一块,真正的软件不是这样的。UI和业务逻辑要分开。

此处接口为业务逻辑。

容器类

ArrayList notes = new ArrayList

容器有两个类型:

容器的类型

元素的类型

对象数组

	int[] ia = new int[10];
		String[] a = new String[10];	//定义了一个String数组 为一个管理者
		System.out.println(ia[0]+2);
//		System.out.println(a[0].length());
		String s = null;
		System.out.println(s.length());
		
输出报错

String[] a = new String[10]; //定义了一个String数组 为一个管理者

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tGpNeXf6-1580663767961)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201230701698.png)]

所以String[]数组当中每一个是一个String类型的管理者 需要指向一个内容做管理

初始没管故为null

public static void main(String[] args) {
		int[] ia = new int[10];
		String[] a = new String[10];	//定义了一个String数组 为一个管理者
		for(int i = 0; i < a.length; i++) {
			a[i] = ""+i;
		}
		System.out.println(ia[0]+2);
		System.out.println(a[0].length());
}
2
1

对象数组中的每一个元素都是对象的管理者而非对象本身。

创建了一个对象数组以后 还要创建对象以后 才有意义,原本没有可以管理的对象 故为null

对象数组的for-each循环

package notebook;

import java.util.ArrayList;

class Value {
	private int i;
	public void set(int i) {this.i = i;}
	public int get() {return i;}
}

public class NoteBook {
	private ArrayList<String> notes = new ArrayList<String>();
	//ArrayList of String 范型类 是一种容器 notes为对象管理者
	
	public void add(String s) {
		notes.add(s);
	}
	
	public void add(String s, int location) {
		notes.add(location, s);	//在location插入一个元素 原来元素后移
	}
	
	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() {	//不直接输出 而是返回一个结果的数组 为以后上层扩展服务
		int[] ia = new int[10];
		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) {
		Value[] a = new Value[10];
		for( int i = 0; i < a.length; i++) {
			a[i] = new Value();
			a[i].set(i);
		}
		for(Value v : a) {	//a在不断的改变管理对象
			System.out.println(v.get());
			v.set(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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfz73LYQ-1580663767964)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201232537996.png)]

for-each循环可以 不断改变v指向的管理对象

容器也可以使用for-each循环

public static void main(String[] args) {
		ArrayList<String> a = new ArrayList<String>();
		a.add("first");
		a.add("second");
		for( String  s : a) {
			System.out.println(s);
		}
}
first
second

集合容器set

set去重

public static void main(String[] args) {
		ArrayList<String> a = new ArrayList<String>();
		a.add("first");
		a.add("second");
		a.add("first");
		for( String  s : a) {
			System.out.println(s);
		}
		System.out.println("-----------");
		HashSet<String> s = new HashSet<String>();
		s.add("first");
		s.add("second");
		s.add("first");
		for( String  k : s) {
			System.out.println(k);
		}
	}
first
second
first
-----------
first
second

容器可以直接输出

	public static void main(String[] args) {
		ArrayList<String> a = new ArrayList<String>();
		a.add("first");
		a.add("second");
		a.add("first");
		System.out.println(a);
		System.out.println("-----------");
		HashSet<String> s = new HashSet<String>();
		s.add("first");
		s.add("second");
		s.add("first");
		System.out.println(s);
	}

输出

[first, second, first]
-----------
[first, second]

set不排序

toString函数可以保证输出

class Value {
	private int i;
	public void set(int i) {this.i = i;}
	public int get() {return i;}
	public String toString() {return ""+i; }
}

	public static void main(String[] args) {
		Value v = new Value();
		v.set(10);
		System.out.println(v);
	}

如果没有加上toString() 则不可以输出

所以在容器中都实现了toString()函数 才可以把 容器直接输出

System.out.println(a);
System.out.println(s);

HashMap()哈希表

package coins;

import java.util.HashMap;
import java.util.Scanner;

public class Coin {
	private HashMap<Integer, String> coinnames = new HashMap<Integer, String>();
	//必须要为Integer 不能用int
	public Coin() {
		coinnames.put(1, "penny");	//一个包裹类型的量可以接受int
		coinnames.put(10, "dime");
		coinnames.put(25, "quarter");
		coinnames.put(50, "half-dollar");
		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) {
		Scanner in = new Scanner(System.in);
		int amount = in.nextInt();
		Coin coin = new Coin();
		String name = coin.getName(amount);
		System.out.println(name);
	}

}

10
4
{1=penny, 50=五毛, 25=quarter, 10=dime}
dime

键值唯一

遍历的方法

package coins;

import java.util.HashMap;
import java.util.Scanner;

public class Coin {
	private HashMap<Integer, String> coinnames = new HashMap<Integer, String>();
	//必须要为Integer 不能用int
	public Coin() {
		coinnames.put(1, "penny");	//一个包裹类型的量可以接受int
		coinnames.put(10, "dime");
		coinnames.put(25, "quarter");
		coinnames.put(50, "half-dollar");
		coinnames.put(50, "五毛");
		System.out.println(coinnames.keySet().size());
		System.out.println(coinnames);
		for(Integer k : coinnames.keySet()) {	//拿keySet
			String s = coinnames.get(k);
			System.out.println(s);
		}
	}
	public String getName(int amount) {
		if(coinnames.containsKey(amount))
			return coinnames.get(amount);
		else 
			return "NOT FOUND";
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int amount = in.nextInt();
		Coin coin = new Coin();
		String name = coin.getName(amount);
		System.out.println(name);
	}

}

10
4
{1=penny, 50=五毛, 25=quarter, 10=dime}
penny
五毛
quarter
dime
dime

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值