Java的集合框架

今天来到了集合框架这里,我知道集合框架还是有很多的,今天这里主要是使用List和Map。集合框架我觉得主要是对集合对象类等方便进行操作。

work_1是使用List进行增删改查对于图书管理系统

书的类定义还是比较简单的

package Java的集合框架;
/*
 * 使用List模拟图书馆系统实现歌曲的增删改查
 * 1,我能抽象出哪些对象?
 * 总书,book
 * 书的类型,这里要求有两个ChildBook和ComputerBook
 * 书的属性:
 * 书名:name
 * 编号:id
 * 价格:price
 * 基本信息:info*/
public class work_1_Book implements Comparable<work_1_Book>{
		String name;
		String id;
		String price;
		String info;
		
		public work_1_Book(String n,String i,String p,String f){
			this.name=n;
			this.id=i;
			this.price=p;
			this.info=f;
		}
		
		//因为图书馆里面书全是固定的,所以没有set
		public String getName() {
			return name;
		}
		
		public String getId() {
			return id;
		}
		
		public String getPrice() {
			return price;
		}
		
		public String getInfo() {
			return info;
		}

		@Override
		public int compareTo(work_1_Book o) {
			return this.getName().compareTo(o.getName());
		}
}

package Java的集合框架;

public class work_1_ChildBook extends work_1_Book{
			public work_1_ChildBook(String n,String i,String p,String f){
				super(n, i, p, f);
			}
			
			public String toString() {
				return "儿童书 ,书名:"+this.getName()+"价格:"+this.getPrice()+"介绍:"+this.getInfo();
			}
}

package Java的集合框架;

public class work_1_ComputerBook extends work_1_Book{
			public work_1_ComputerBook(String n,String i,String p,String f){
				super(n, i, p, f);
			}
			
			public String toString() {
				return "计算机书 ,书名:"+this.getName()+"价格:"+this.getPrice()+"介绍:"+this.getInfo();
			}
}
现在对象类的定义在明白属性和功能后,一切都不是问题。主要就是接下来的操作类

要实现增删改查,有的直接使用方法,也有的需要逻辑编写程序

package Java的集合框架;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
/*
 * 使用List来存放书籍
 * 以及增删改查*/
import java.util.List;

public class work_1_BookDao {
			private List<work_1_Book> allBooks;			
			
			public work_1_BookDao(){
				super();
				allBooks=new ArrayList<work_1_Book>();
			}
			
			//查询所有的书籍
			public List<work_1_Book> getAllBook() {
				return allBooks;
			}
			
			
			//增添书籍
			//哦添加之后遍历循环如果有相同的元素,移出,remove()
			public void addBook(work_1_Book book){
				this.allBooks.add(book);
				for (int i=0;i<allBooks.size()-1;i++)
					for (int j=allBooks.size()-1;j>i;j--){
						if (allBooks.get(j).getName().equals(allBooks.get(i).getName()))
								allBooks.remove(j);
					}
			}
			
//			public void addBookJudge(work_1_Book book) {
//				System.out.println("测试");
//				String n=book.getName();
//				System.out.println(n);
//				for (work_1_Book temp:this.allBooks){
//					if (!(temp.getName().equals(n))){
//						this.allBooks.add(book);
//					}
//					else{
//						System.out.println("已经包含"+n+"此书");
//					}
//				}
//				
//			}
			
			//删除书籍
			public void deleteBook(work_1_Book book) {
				this.allBooks.remove(book);
			}
			
			//根据书名查询某书
			public work_1_Book getBookByName(String name) {
				work_1_Book book=null;
				for (work_1_Book tempBook:this.allBooks){			//for遍历一个类集合
					if (tempBook.getName().equals(name)){
						book=tempBook;
						break;
					}
				}
				return book;
			}
			
			//模糊查询?
			public List<work_1_Book> index(String keyWord){
				List<work_1_Book> list=new ArrayList<work_1_Book>();
				for (work_1_Book temp:this.allBooks){
					if (temp.getName().indexOf(keyWord)!=-1)		//indexOf关键字相同
						list.add(temp);
				}
				return list;
			}
			
			//列出所有书籍
			public void showAllBooks() {
				getAllBook();
				Iterator<work_1_Book> iter=allBooks.iterator();			//迭代器,把类集合放入迭代器里面
				while(iter.hasNext()){
					work_1_Book b=iter.next();
					System.out.println(b);
				}
			}
			
			//按照书名的方式进行排序
			public void sortAllBook(){
				getAllBook();
				Collections.sort(allBooks);
				showAllBooks();
				
			}
}
一一道来:

增加:如果没有重复加入这一说,直接用List里的add方法即可,但是如果不能重复加入,就需要用for循环遍历,找出相同的,在用remove()移出即可。

注释那里是我一开始自己想的,感觉逻辑上说的过去,但是总是有bug存在于for循环的参数里面,为什么我那样遍历就不可以呢?

删除:根据参数直接删除即可

查找:这里是没有直接可使用的功能,所以需要遍历循环if找到符合条件的,equals用的地方很多。

上面还有一个模糊查询,主要让我们了解indexOf的功能,以后的查找关键字什么类似情况会用到的吧

排序:如果要排序,那么就要在父类里面接口implements Comparable<>,在功能里面

public int compareTo(work_1_Book o) {
return this.getName().compareTo(o.getName());
}

自己重新定义你想排序的属性即可。

输出:用到了迭代器,很好的一个输入集合类里面实例的迭代器,以后也会多多用到的。

最后在main函数里面实例进行测试

package Java的集合框架;

public class work_1_test {

	public static void main(String[] args) {
		work_1_Book b1=new work_1_ChildBook("a一千零一夜", "200401", "10$", "传说故事");
		work_1_Book b2=new work_1_ChildBook("b安徒生童话", "200501", "15$", "童话故事");
		work_1_Book b3=new work_1_ChildBook("c爱丽丝梦游奇境", "200601", "20$", "冒险故事");
		work_1_Book b4=new work_1_ComputerBook("dJava语言", "210101", "20$", "编程");
		work_1_Book b5=new work_1_ComputerBook("eC++", "210201", "34$", "继续编程");
		work_1_Book b6=new work_1_ComputerBook("fLinux", "210301", "30$", "操作系统");
		work_1_Book b7=new work_1_ComputerBook("dJava语言", "210101", "20$", "编程");
		
		work_1_BookDao book=new work_1_BookDao();
		book.addBook(b6);
		book.addBook(b5);
		book.addBook(b4);
		book.addBook(b3);
		book.addBook(b2);
		book.addBook(b1);
		book.addBook(b7);
		book.showAllBooks();
		
		work_1_Book delete=book.getBookByName("eC++");
		book.deleteBook(delete);
		
		System.out.println("删除后");
		book.showAllBooks();
		
		System.out.println("排序后");
		book.sortAllBook();

	}
	

}
可以看到初始化图书时很麻烦,所以要是改进的话,把图书放到文件里面,像这几天一样对读写文件后进行操作。

以上这个对集合类的for遍历方式有了认识,排序之前用过的,那个好像写复杂了多。今天再次了解。

work_2是模拟电话号码管理,因为用到了JOptionPane这个好像真方便的消息提示框,大家只要记牢这个是提示框就可以了,有好多方便的方法直接用。

用的是Map(),因为name->phone,name是键,phone就是键对应的值

这次是用到了从文件中读取数据

package Java的集合框架;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import javax.swing.JOptionPane;

/*
 * */
public class work_2_PhoneBook {
			String phoneNumber;
			String name;
			
			private Map<String,String> phones=new TreeMap<String,String>();
			
			public void readPhoneBooks() throws IOException{
				BufferedReader br=new BufferedReader(new FileReader(new File("D:/A-大三-Java学习/phonebook.txt")));
				String l=null;
				while ((l=br.readLine())!=null){
					String[] tokens=l.split("/");			//又是这个split方法拆分电话信息
					phones.put(tokens[0], tokens[1]);		//map里面的put()方法存放名字和电话
				}	
			}
			
			//显示读取到的所有电话信息
			public void displayAllphones() {
				//得到键的集合,即名字集合
				Set<String>	keySet=phones.keySet();
				//使用StringBuffer来拼接字符串
				StringBuffer sb=new StringBuffer("你的电话本有如下记录:\n");
				//遍历set集合,根据名字取得电话
				for (String name:keySet){			//for遍历集合
					String phone=phones.get(name);			//从名字得到手机号
					sb.append(name+"-->"+phone+"\n");
				}
				JOptionPane.showMessageDialog(null, sb.toString());
			}
			
			//添加新记录,有重复可提示
			public void addNewPhone() throws IOException {
				name=JOptionPane.showInputDialog("请输入名字:");
				phoneNumber=JOptionPane.showInputDialog("请输入电话号码:");
				//如果名字有重复
				processName();
				phones.put(name, phoneNumber);
				//更新文件记录,插入一条新的记录
				updatePhonebook(name,phoneNumber);
				String message="添加新的记录成功\n名字:"+name+"\n电话号码:"+phoneNumber;
				JOptionPane.showMessageDialog(null, message);
			}
			
			private void processName(){
				while (phones.containsKey(name)){			//循环直到不包含重复名字为止
					String message="电话本上存在同名的记录\n请使用另外的名字";
					name=JOptionPane.showInputDialog(message);
				}
			}
			
			//用print写入
			public void updatePhonebook(String n,String p) throws IOException{
				PrintWriter pw=new PrintWriter(new FileWriter(new File("D:/A-大三-Java学习/choicetest.txt"),true));//true意味添加文件末尾
				pw.println(n+"/"+p);
				pw.close();
			}
			
			//根据姓名查询电话
			public void search() throws IOException{
				String choice=null;
				name=JOptionPane.showInputDialog("请输入你要查询的名字");
				if (phones.containsKey(name)){			//和上面while居然是一个表达式
					phoneNumber=phones.get(name);
					display(name,phoneNumber);
				}else{
					String message="这个名字不存在\n你想要添加这条记录吗?(y/n)";
					choice=JOptionPane.showInputDialog(message);
					if (choice.matches("[y|Y]"))
						addNewPhone();
				}
			}
			
			private void display(String n,String p){
				String message="name"+name+"phonenumber"+phoneNumber;
				JOptionPane.showMessageDialog(null, message);
			}
			
			public String makeChoice(){
				String choice=null;
				String message="欢迎使用电话本程序\n1.查看所有电话\n2.添加电话\n3.查询电话\n4.退出\n";
				boolean done=false;
				while (!done){
					choice=JOptionPane.showInputDialog(message);
					if (choice.matches("[1|2|3|4]"))
						done=true;
					else
						JOptionPane.showMessageDialog(null, "输入错误");
				}
				return choice;
			}
			
}	
package Java的集合框架;

import java.io.IOException;

public class work_2_test {

	public static void main(String[] args) throws IOException {
		work_2_PhoneBook pb=new work_2_PhoneBook();
		pb.readPhoneBooks();
		switch(pb.makeChoice()){
		case "1":
			pb.displayAllphones();
			break;
		case "2":
			pb.addNewPhone();
			break;
		case "3":
			pb.search();
			break;
		case "4":
			break;
		}
	
	}

}
其实这个一波操作下来,感触最深得就是面向对象就是有好多方法供你使用,前题是你要知道。因为在做work_2的时候周围环境不太好,导致并没什么感觉。

//得到键的集合,即名字集合
Set<String>	keySet=phones.keySet();
得到键的集合,用keySet();

for (String name:keySet){			//for遍历集合
	String phone=phones.get(name);			//从名字得到手机号
	sb.append(name+"-->"+phone+"\n");
		}
通过键的集合,遍历出对应的值集合

phones.put(name, phoneNumber);
put为基本的添加数据。

phones.containsKey(name)
根据键值找值,找到返回值为true

phones.get(name);
这个是找到对应值

以上是对于map的使用,对于键对应值的对象,map确实是很好用。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值