java大作业1–电话簿


一、题目

Java程序设计实用教程p402 12-13

二、预览

电话号码用什么数据类型java 电话号码簿java编程_电话号码用什么数据类型java


电话号码用什么数据类型java 电话号码簿java编程_数据_02


电话号码用什么数据类型java 电话号码簿java编程_电话号码用什么数据类型java_03


电话号码用什么数据类型java 电话号码簿java编程_java_04


电话号码用什么数据类型java 电话号码簿java编程_数据_05

三、题解


一.Friend类
首先明确这个电话簿存入的信息为一个个Friend,每一个Friend需要具有姓名,性别,电话号码,关系这几个属性。之后,写构造方法(我这里只写了一个),以及一系列的get方法。

package 电话簿;

//记住要写入对象文件的Friend类必须实现序列化接口
public class Friend implements java.io.Serializable{

	private String name;
	private String sex;
	private String tel;
	private String friendship;
	
	public Friend(String name,String sex,String tel,String friendship)
	{
		this.name = name;
		this.sex = sex;
		this.tel = tel;
		this.friendship = friendship;
	}
	
	public String getName()
	{
		return name;
	}
	
	public String getSex()
	{
		return sex;
	}
	
	public String getTel()
	{
		return tel;
	}
	
	public String getFriendship()
	{
		return friendship;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

二.Friends类
为了更为方便地管理从后台(文件)拿到的数据,我写了一个Friends类,它具有姓氏,HashMap map(以姓名作为键值,用于存储一系列相同姓氏不同名字的Friend),为该姓氏的Friend的数目这几个属性。之后,写构造方法(我也只写了一个),添加方法,删除方法,以及一系列get方法。

package 电话簿;

import java.util.HashMap;

//数据中转站
public class Friends implements java.io.Serializable{

	private String family_name;// 姓氏
	private HashMap<String, Friend> map;// 里面存放这一堆这个姓氏的人的数据
	private int friends_num;// 该姓氏的人数

	public Friends(String family_name)// 以姓作为本类的关键
	{
		this.family_name = family_name;
		map = new HashMap<String, Friend>();
		this.friends_num = 0;
	}
	
	public void add(Friend f)//添加方法
	{
		//System.out.println(f.getName());
		if(!map.containsKey(f.getName()))//若Friends中不含有这这个姓名的Friend,则增加Friend数目
		{
			//System.out.println(1);
			this.friends_num++;
		}
		this.map.put(f.getName(), f);
	}
	
	public int delete(String name)// 删除方法,对应前端的删除按钮
	{
		if(map.containsKey(name))
		{
			map.remove(name);
			this.friends_num--;
			return 1;//删除成功返回1给前端,由前端作出show区界面改变的反应
		}
		return 0;
	}

	public int get_friends_num() {
		return friends_num;
	}

	public String get_family_name() {
		return family_name;
	}
	
	public HashMap<String,Friend> get_map()
	{
		return map;
	}

}

三.Home类
Home类写了对前端和后台的操作,代码主要集中在这个部分,其实按理来说我觉得不应该这样集中在这里的,但是懒地管那么多了。该类包含的属性众多,其中有一个用于存放从后台和前端读来的Friends的arraylist链表。
1.前端界面部分
(1)将初始化写在了init方法里了,包含了外框处理,姓氏列表,操作区域,分割设置,数据集初始化。
(2)maketable操作:由于涉及到众多更新前端表格的操作,所以单独将maketable方法写出,以便调用。maketable本质为对JTable的操作,关键在于放入其中的Object二维数组datas生成问题,datas不同使得表中的数据不同。而datas的生成主要靠前端用户输入后更新一次或者后台读入更新一次。
2.后台操作部分(涉及读写对象文件)
(1)操作主要放在相应事件actionPerformed中,有添加,删除,打开(文件),保存(文件),排序,查找,定时保存(线程)。然后几乎都要用到maketable。
(2)openFile操作:由于涉及多次相同的打开文件操作,所以将openfile方法单独写出,以便调用。主要为从文件中读出数据的操作,然后maketable。
(3)涉及到点击姓氏列表框会更新对应表格数据所以写了mousePressed方法,主要还是maketable。

package 电话簿;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

//文件的读入读出用对象字节流,读的是friends对象
public class Home extends JFrame implements ActionListener,MouseListener,Runnable{

	JButton Add, Delete, Open, Save;// 四大按钮
	JList<String> familyname_List;// 姓氏列表
	DefaultListModel<String> family_names;
	JScrollPane left_jsc;
	JPanel right_Page, process_Page;
	JTable show_Page;
	JTextField name_Field, tel_Field, friendship_Field;// 姓名输入区域,电话输入区域,关系输入区域
	JRadioButton m, w;// 男女单选栏
	JCheckBox time_Save;// 定时保存单选栏
	JComboBox<String> find_Key, order_Key;// 查找关键字,排序关键字设置栏
	JComboBox<Integer> time_Setting;// 保存时间设置栏
	Object[][] datas;// 存放得到的数据
	JScrollPane show_jsc;
	JSplitPane jsp1,jsp2;
	ArrayList<Friends> arraylist;// 数据中转站,存放产生的friends对象
	Friends friends;// 当前所处的姓氏区
	int friends_num;//该姓氏区拥有的人数
	JFileChooser fc;// 文件选择器
	String filename;// 打开的文件名
	Thread thread;
	int timekey;//自动保存间隔时间

	public Home() {
		// 初始化界面
		super("电话簿");
		init();
		this.setVisible(true);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Home();
	}

	public void init() {
		// 外框处理
		this.setSize(900, 280);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);

		// 姓氏列表
		family_names = new DefaultListModel<String>();
		familyname_List = new JList<String>(family_names);
		familyname_List.addMouseListener(this);//注意,对象的监听器每new一次就得注册一回监听器
		left_jsc = new JScrollPane(familyname_List);

		// 操作区域
		process_Page = new JPanel(new GridLayout(2, 1));

		JLabel title = new JLabel(" Friend"); // 标题栏

		JPanel input_Page = new JPanel(new FlowLayout()); // 输入栏
		name_Field = new JTextField("姓名", 15);// 姓名输入框
		m = new JRadioButton("男");// 性别选择栏
		w = new JRadioButton("女");
		m.addActionListener(this);
		w.addActionListener(this);
		ButtonGroup bg = new ButtonGroup();
		bg.add(m);
		bg.add(w);
		tel_Field = new JTextField("电话号码", 17);// 电话号码输入框
		friendship_Field = new JTextField("关系", 23);// 关系输入框
		friendship_Field.setSize(187, 20);
		input_Page.add(name_Field);
		input_Page.add(m);
		input_Page.add(w);
		input_Page.add(tel_Field);
		input_Page.add(friendship_Field);

		JPanel deal_Page = new JPanel(new FlowLayout()); // 操作栏
		JToolBar tb = new JToolBar();
		Add = new JButton("添加");// 添加按钮
		Add.addActionListener(this);
		Delete = new JButton("删除");// 删除按钮
		Delete.addActionListener(this);
		JLabel lb1 = new JLabel("查找关键字");
		find_Key = new JComboBox<String>();// 设置查找关键字设置栏
		find_Key.addActionListener(this);
		String[] findkeys = { "空值","姓名", "性别", "电话", "关系" };
		for (int i = 0; i < 5; i++) {
			find_Key.addItem(findkeys[i]);
		}
		JLabel lb2 = new JLabel("排序关键字");
		order_Key = new JComboBox<String>();// 设置排序关键字设置栏
		order_Key.addActionListener(this);
		String[] orderkeys = { "空值","姓名" };
		for (int i = 0; i < 2; i++) {
			order_Key.addItem(orderkeys[i]);
		}
		Open = new JButton("打开");// 打开按钮
		Open.addActionListener(this);
		Save = new JButton("保存");// 保存按钮
		Save.addActionListener(this);
		time_Save = new JCheckBox("定时保存");
		time_Save.addActionListener(this);
		time_Setting = new JComboBox<Integer>();// 设置保存时间设置栏
		time_Setting.addActionListener(this);
		for (int i = 1; i <= 10; i++) {
			time_Setting.addItem(i);
		}
		JLabel lb3 = new JLabel("分钟");
		deal_Page.add(Add);
		deal_Page.add(Delete);
		deal_Page.add(lb1);
		deal_Page.add(find_Key);
		deal_Page.add(lb2);
		deal_Page.add(order_Key);
		deal_Page.add(Open);
		deal_Page.add(Save);
		deal_Page.add(time_Save);
		deal_Page.add(time_Setting);
		deal_Page.add(lb3);
		// deal_Page.add(tb);

		JSplitPane jsp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);// 小分割 //添加操作区域组件
		jsp.setTopComponent(title);
		jsp.setBottomComponent(input_Page);
		process_Page.add(jsp);
		process_Page.add(deal_Page);

		// 分割设置
		jsp1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);// 第一分割
		jsp1.setDividerLocation(100);// 设置第一分割线位置
		jsp1.setLeftComponent(left_jsc);// 设置第一分割左半边内容
		right_Page = new JPanel();
		jsp1.setRightComponent(right_Page);// 设置第一分割右半边内容
		this.add(jsp1);// 添加第一分割

		// 第二分割由maketable完成
		//数据集初始化
		// 显示区域--表格
		datas = null;
		makeTable(null);

		// 初始化arraylist:这里主要是用于用户直接添加数据而未打开原有的文件;并初始化friends_num
		arraylist = new ArrayList<Friends>();
		friends_num = 0;
		
		this.thread = new Thread(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub

		if (e.getSource() == Add)// 添加,往姓氏列表,show区,中转站添加input区的数据
		{
			String name, sex, tel, friendship;
			name = this.name_Field.getText();// 得到姓名
			sex = "男";
			if (m.isSelected())// 得到性别
			{
				sex = "男";
			}
			if (w.isSelected()) 
			{
				sex = "女";
			}
			tel = this.tel_Field.getText();// 得到电话
			friendship = this.friendship_Field.getText();// 得到关系
			// 添加数据到当前姓氏区对应的中转站
			Friend f = new Friend(name, sex, tel, friendship);
			// 判断一下输入的人的数据的姓是否已存在,若已存在则添加到对应的姓氏区,反之则创造一个新的姓氏区
			int findindex = 0;
			for (Friends F : arraylist) {
				if (F.get_family_name().equals(f.getName().charAt(0) + "")) {
					break;
				}
				findindex++;
			}
			if (findindex < this.friends_num)// 找到了
			{
				arraylist.get(findindex).add(f);
			}
			else {
				arraylist.add(new Friends(f.getName().charAt(0) + ""));// 将数据添加到表尾
				this.friends_num++;
				// System.out.println(arraylist.get(this.friends_num-1).get_family_name());
				arraylist.get(friends_num-1).add(f);
				friends = arraylist.get(0);
			}
			// 添加数据到当前姓氏区的show区
			datas = new Object[friends.get_friends_num()][4];
			int i = 0;
			for (String key : friends.get_map().keySet()) {
				Friend f0 = friends.get_map().get(key);
				datas[i][0] = f0.getName();
				datas[i][1] = f0.getSex();
				datas[i][2] = f0.getTel();
				datas[i][3] = f0.getFriendship();
				i++;
			}
			makeTable(datas);
			// 添加数据到姓氏列表
			family_names = new DefaultListModel<String>();
			family_names.addElement("全部");
			for (Friends F : arraylist) {
				family_names.addElement(F.get_family_name());
			}
			familyname_List = new JList<String>(family_names);
			familyname_List.addMouseListener(this);
			left_jsc = new JScrollPane(familyname_List);
			jsp1.setDividerLocation(100);// 设置第一分割线位置
			jsp1.setLeftComponent(left_jsc);// 设置第一分割左半边内容
		}
		if (e.getSource() == Delete)// 删除,将show区,中转站,后台中对应input区的数据删除
		{
			int j=0;
			String keyname = this.name_Field.getText();
			for(Friends F : arraylist)
			{
				if(F.delete(keyname)==1)
				{
					break;
				}
				j++;
			}
			// 添加数据到当前姓氏区的show区
			datas = new Object[friends.get_friends_num()][4];
			int i = 0;
			for (String key : friends.get_map().keySet()) {
				Friend f0 = friends.get_map().get(key);
				datas[i][0] = f0.getName();
				datas[i][1] = f0.getSex();
				datas[i][2] = f0.getTel();
				datas[i][3] = f0.getFriendship();
				i++;
			}
			makeTable(datas);
			// 添加数据到姓氏列表
			if(j<this.friends_num)
			{
				if(arraylist.get(j).get_friends_num()==0)
				{
					arraylist.remove(j);
					family_names = new DefaultListModel<String>();
					family_names.addElement("全部");
					for (Friends F : arraylist) {
						family_names.addElement(F.get_family_name());
					}
					familyname_List = new JList<String>(family_names);
					familyname_List.addMouseListener(this);
					left_jsc = new JScrollPane(familyname_List);
					jsp1.setDividerLocation(100);// 设置第一分割线位置
					jsp1.setLeftComponent(left_jsc);// 设置第一分割左半边内容
				}
			}
		}
		if (e.getSource() == Open)// 打开:打开文件,将文件中的数据读到由friends构成的arraylist中
		{
			// 文件操作
			fc = new JFileChooser(new File("D:\\冬瓜的神秘空间1\\my PROGRAM(java)\\电话簿"));// 设置开始文件夹
			FileNameExtensionFilter filter = new FileNameExtensionFilter("Java文件(*.java)", "txt");// 设置只出现的文件格式
			fc.setFileFilter(filter);
			if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)// 选中文件后操作
			{
				File file = fc.getSelectedFile();
				openFile(file);
			}
		}
		if (e.getSource() == Save)// 保存
		{
			if (filename != null)// 若已打开了某文件,后台添加数据后保存
			{
				try {
					OutputStream out = new FileOutputStream(filename);
					ObjectOutputStream objout = new ObjectOutputStream(out);
					for (Friends F : arraylist) {
						objout.writeObject(F);
					}
					objout.close();
					out.close();
				} catch (IOException ex) {
				}
			} else// 反之,创建文件,将数据写入文件中并保存
			{
				int i;
				String inputfilename = "我的电话簿";
				fc = new JFileChooser(new File("D:\\冬瓜的神秘空间1\\my PROGRAM(java)\\电话簿"));// 设置开始文件夹
				FileNameExtensionFilter filter = new FileNameExtensionFilter("Java文件(*.java)", "txt");// 设置只出现的文件格式
				fc.setFileFilter(filter);
				if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION)// 创建一个文件,由用户输入文件名并保存
				{
					inputfilename = fc.getSelectedFile().toString();

					for (i = inputfilename.length() - 1; i > 0; i--) {
						if (inputfilename.charAt(i) == '\\') {
							break;
						}
					}
					inputfilename = inputfilename.substring(i + 1);
					File file = new File("D:\\冬瓜的神秘空间1\\my PROGRAM(java)\\电话簿", inputfilename);
					try {
						file.createNewFile();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					try {
						OutputStream out = new FileOutputStream(file.toString());
						ObjectOutputStream objout = new ObjectOutputStream(out);
						for (Friends F : arraylist) {
							objout.writeObject(F);
						}
						objout.close();
						out.close();
					} catch (IOException ex) {
					}
					openFile(file);
				}
			}
		}
		if(e.getSource() instanceof JComboBox)//得到事件源
		{
//			System.out.println(friends);
			//进行查找操作的时候不要进行排序!!!
			if(this.friends!=null)
			{
				String findkey = (String) find_Key.getSelectedItem();//这个方法用于返回用户选择的那个对象
//				System.out.println(findkey);
				if(findkey.equals("姓名"))//按input框输入的姓名查找
				{
//					System.out.println(1);
					String keyname = this.name_Field.getText();
					for(Friends F : arraylist)
					{
						if(F.get_map().containsKey(keyname))
						{
							datas = new Object[1][4];
							datas[0][0] = F.get_map().get(keyname).getName();
							datas[0][1] = F.get_map().get(keyname).getSex();
							datas[0][2] = F.get_map().get(keyname).getTel();
							datas[0][3] = F.get_map().get(keyname).getFriendship();
							makeTable(datas);
							break;
						}
					}
				}
				if(findkey.equals("性别"))//按input框输入的性别查找
				{
					String keysex="男";
					if (m.isSelected())// 得到性别
					{
						keysex = "男";
					}
					if (w.isSelected()) 
					{
						keysex = "女";
					}
					datas = new Object[friends.get_friends_num()][4];
					int i = 0;
					for (String key : friends.get_map().keySet()) {
						if(friends.get_map().get(key).getSex()==keysex)
						{
							Friend f0 = friends.get_map().get(key);
							datas[i][0] = f0.getName();
							datas[i][1] = f0.getSex();
							datas[i][2] = f0.getTel();
							datas[i][3] = f0.getFriendship();
							i++;
						}
					}
					makeTable(datas);	
				}
				if(findkey.equals("电话"))//按input框输入的电话查找
				{
					int sum=0;
					String keytel = this.tel_Field.getText();
					for(Friends F : arraylist)
					{
						for (String key : F.get_map().keySet()) {
							if(F.get_map().get(key).getTel().equals(keytel))
							{
								sum++;
							}
						}
					}
					datas = new Object[sum][4];
					int i = 0;
					int flag = 0;
					for(Friends F : arraylist)
					{
						for (String key : F.get_map().keySet()) {
							if(F.get_map().get(key).getTel().equals(keytel))
							{
								Friend f0 = F.get_map().get(key);
								datas[i][0] = f0.getName();
								datas[i][1] = f0.getSex();
								datas[i][2] = f0.getTel();
								datas[i][3] = f0.getFriendship();
								i++;
							}
							if(i>=sum)
							{
								flag=1;
								break;
							}
						}
						if(flag==1)
						{
							break;
						}
					}
					makeTable(datas);	
				}
				if(findkey.equals("关系"))//按input框输入的关系查找
				{
					String keyfriendship = this.friendship_Field.getText();
					datas = new Object[friends.get_friends_num()][4];
					int i = 0;
					for (String key : friends.get_map().keySet()) {
						if(friends.get_map().get(key).getFriendship().contains(keyfriendship))
						{
							Friend f0 = friends.get_map().get(key);
							datas[i][0] = f0.getName();
							datas[i][1] = f0.getSex();
							datas[i][2] = f0.getTel();
							datas[i][3] = f0.getFriendship();
							i++;
						}
					}
					makeTable(datas);	
				}
				String orderKey = (String) order_Key.getSelectedItem();
				if(orderKey=="姓名")//以姓名做关键之按字典序罗列
				{
					Friend[] f = new Friend[100];
					int i=0;
					for (String key : friends.get_map().keySet()) {
						f[i]=friends.get_map().get(key);
//						System.out.println("1"+f[i]);
						i++;
					}
					MyComparator cmp = new MyComparator();
					Arrays.sort(f,0,i,cmp);
					datas = new Object[friends.get_friends_num()][4];
					for(i=0;i<friends.get_friends_num();i++)
					{
						datas[i][0] = f[i].getName();
						datas[i][1] = f[i].getSex();
						datas[i][2] = f[i].getTel();
						datas[i][3] = f[i].getFriendship();
					}
					makeTable(datas);
				}
			}
		}
		//自动保存
		if(e.getSource() instanceof JCheckBox)
		{
			if(e.getActionCommand().equals("定时保存"))
			{
				timekey = (Integer) time_Setting.getSelectedItem();
				System.out.println(timekey);
				if(this.thread.getState()!=Thread.State.NEW)
				{
					this.thread = new Thread(this);
				}
				this.thread.start();
			}
			else
			{
				this.thread.interrupt();
			}
		}
	}

	public void makeTable(Object[][] datas)// 生成表格
	{
		if (datas != null) {
			//System.out.println(datas[0][0]);
			String[] titles = { "姓名", "性别", "电话号码", "关系" };// 创建表格中的横标题
			show_Page = new JTable(datas, titles);// 创建初始表格
			show_Page.setPreferredScrollableViewportSize(new Dimension(750, 70));// 设置表格属性
			show_jsc = new JScrollPane(show_Page);
			// 注意,这里不能再new一个jsp2了,要用原来的,不然会一直往下加分割!!!
			jsp2.setTopComponent(show_jsc);// 设置第二分割上半边内容
			jsp2.setDividerLocation(100);// 设置第二分割位置
			jsp2.setBottomComponent(process_Page);// 设置第二分割下半边内容
		} else {
			datas = new Object[0][4];
			String[] titles = { "姓名", "性别", "电话号码", "关系" };// 创建表格中的横标题
			show_Page = new JTable(datas, titles);// 创建初始表格
			show_Page.setPreferredScrollableViewportSize(new Dimension(750, 70));// 设置表格属性
			show_jsc = new JScrollPane(show_Page);
			jsp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);// 第二分割
			jsp2.setTopComponent(show_jsc);// 设置第二分割上半边内容
			jsp2.setDividerLocation(100);// 设置第二分割位置
			jsp2.setBottomComponent(process_Page);// 设置第二分割下半边内容
			right_Page.add(jsp2);// 添加分割
		}
	}

	public void openFile(File file) {
		filename = file.toString();
		arraylist = new ArrayList<Friends>();// 初始化arraylist
		// 从文件中读取数据
		try {
			InputStream in = new FileInputStream(filename);
			ObjectInputStream objin = new ObjectInputStream(in);
			while (true) {
				System.out.println(1);
				try {
					arraylist.add((Friends) objin.readObject());
					this.friends_num++;
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (EOFException eof) {
					break;
				}
			}
			in.close();
			objin.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		// 将arraylist[0]数据写入show区与姓氏列表
		// 姓氏列表
		family_names = new DefaultListModel<String>();
		family_names.addElement("全部");
		for (Friends F : arraylist) {
			family_names.addElement(F.get_family_name());
//			System.out.println(1);
		}
		familyname_List = new JList<String>(family_names);
		familyname_List.addMouseListener(this);
		left_jsc = new JScrollPane(familyname_List);
		jsp1.setDividerLocation(100);// 设置第一分割线位置
		jsp1.setLeftComponent(left_jsc);// 设置第一分割左半边内容
		// show区
//		System.out.println(arraylist.size());
		friends = arraylist.get(0);
//		System.out.println(friends);
		datas = new Object[friends.get_friends_num()][4];
		int i = 0;
		for (String key : friends.get_map().keySet()) {
			Friend f = friends.get_map().get(key);
			datas[i][0] = f.getName();
			datas[i][1] = f.getSex();
			datas[i][2] = f.getTel();
			datas[i][3] = f.getFriendship();
			i++;
		}
		makeTable(datas);
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		//列表框相应事件
		int key0 = this.familyname_List.getSelectedIndex();
//		System.out.println(1);
		if(key0==0)//选择全部
		{
			int sum=0;
			for(Friends F : arraylist)
			{
				sum+=F.get_friends_num();
			}
			datas = new Object[sum][4];
			int i=0;
			for(Friends F : arraylist)
			{
				for (String key : F.get_map().keySet()) {
					Friend f = F.get_map().get(key);
					datas[i][0] = f.getName();
					datas[i][1] = f.getSex();
					datas[i][2] = f.getTel();
					datas[i][3] = f.getFriendship();
					i++;
				}
			}
			makeTable(datas);
		}
		else//选择某个姓氏
		{
			friends = arraylist.get(key0-1);
			datas = new Object[friends.get_friends_num()][4];
			int i = 0;
			for (String key : friends.get_map().keySet()) {
				Friend f = friends.get_map().get(key);
				datas[i][0] = f.getName();
				datas[i][1] = f.getSex();
				datas[i][2] = f.getTel();
				datas[i][3] = f.getFriendship();
				i++;
			}
			makeTable(datas);
		}
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println(2);
		if (filename != null)// 若已打开了某文件,后台添加数据后保存
		{
			
			while(true)
			{
				try
				{
					try {
						OutputStream out = new FileOutputStream(filename);
						ObjectOutputStream objout = new ObjectOutputStream(out);
						for (Friends F : arraylist) {
							objout.writeObject(F);
						}
						objout.close();
						out.close();
					} catch (IOException ex) {
					}
					Thread.sleep(this.timekey*1000*60);//从1ms开始换算
				}
				catch(InterruptedException ex)
				{
					break;
				}
				
			}
		}
	}

}

四.MyComparator类
用于比较Friend的比较器,按需,所以只写了按名字比较(用于实现字典序排序)

package 电话簿;

import java.util.Comparator;

//用于比较Friend的比较器类
public class MyComparator implements Comparator<Friend>{

	@Override
	public int compare(Friend f1, Friend f2) {
		// TODO Auto-generated method stub
//		System.out.println(f1);
		return f1.getName().compareTo(f2.getName());
	}

}