今天来到了集合框架这里,我知道集合框架还是有很多的,今天这里主要是使用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确实是很好用。