泛型集合框架

1 编写一个Book类,该类至少有nameprice两个属性该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系在主函数中选择合适的集合类型存放Book类的若干个对象然后创建一个新的Book类的对象,并检查该对象与集合中的哪些对象相等。查询结果如下图:


package 泛型集合框架;
import java.util.*;
import java.util.Map.Entry;

public class Book implements Comparable<Book>{
	String name;
	int price;
	Book(String string, int i) {
		name = string;
		price = i;
	}
	public static void main(String[] args) {
		Map<String,Integer> map = new LinkedHashMap<String,Integer>();  //使用map双列集合实现泛型的两种泛型参数
		map.put("我最贵",30);
		map.put("Java基础教程",29);
		map.put("数据库技术",29);
		map.put("C++基础教程",29);
		Book newbook = new Book("模式识别",29);
		System.out.println("新书:《模式识别》与下列图书:");
		Set<Map.Entry<String,Integer>> set = map.entrySet();   //Map.entrySet()方法返回Set<Map.Entry<K,V>>
		for (Entry<String,Integer> book : set) {                 //foreach遍历set集合中的元素
			Book comBook=new Book(book.getKey(),book.getValue());   //将Entry类型转换为Book类型
			if(newbook.compareTo(comBook)==0)                   
				System.out.println(comBook.name);  
		}
		System.out.println("价格相同,具体价格为:"+newbook.price);
	}

	public int compareTo(Book b) {    //重写Comparable接口的compareTo方法
		if(this.price - b.price > 0)
			return 1;
		if(this.price - b.price == 0)
			return 0;
		return -1;
	}
}


2 编写一个应用程序,用户分别从两个文本框输入学生的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。示例如下:


import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class StudentSort extends JFrame{
	GridLayout grid = new GridLayout(1,1);     //设置边框式布局
	JTextField nameText = new JTextField(10),   //设置文本框
			scoreText = new JTextField(10);
	JScrollPane scroll;             //设置滚动窗格
	JTextArea area;                 //设置文本域
	JLabel name = new JLabel("姓名"),
			score = new JLabel("分数");
	JButton ok = new JButton("排序");
	JPanel panel = new JPanel();     //设置面板
	MyInnerListener listener;        //设置事件监听类
	Map<String,String> map = new TreeMap<String,String>();    //利用泛型约束集合的数据类型为字符串

	void JPanel() {      //面板控件设置
		panel.add(name);
		panel.add(nameText);
		panel.add(score);
		panel.add(scoreText);
		panel.add(ok);
		area = new JTextArea();
		scroll = new JScrollPane(area);
		this.getContentPane().add(panel, BorderLayout.NORTH);		
		this.getContentPane().add(scroll, BorderLayout.CENTER);
		listener = new MyInnerListener();    //事件监听类的实例化
	}

	void Bind() {            //绑定事件源
		ok.addActionListener(listener);
	}

	public static void main(String[] args) {

		new StudentSort();
	}
	public StudentSort() {
		JPanel();
		Bind();
		this.setTitle("学生成绩排序");		
		this.setSize(400, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	private class MyInnerListener implements ActionListener{  //实现ActionListener接口
		public void actionPerformed(ActionEvent action) {
			String str = "";       //初始输出串
			if(name.getText()!=null && score.getText()!=null) {   //当学生和成绩都已输入文本框
				map.put(nameText.getText(),scoreText.getText());  //将文本框的内容添加进map集合
				Map<String, String> resultMap = sortMapByValue(map);   //设置第二个map集合以便储存结果
				for (Map.Entry<String, String> entry : resultMap.entrySet()) {  //foreach循环遍历第二个map集合
					str += name.getText()+':'+entry.getKey()+'	'+score.getText()+':'+entry.getValue()+'\n';  //输出字符串
					area.setText("");   //清空上一次文本域的内容
					area.append(str);   //文本域显示排序后的信息
				}
				nameText.setText(null);     //清空文本框
				scoreText.setText(null);
			}
		}

		private Map<String, String> sortMapByValue(Map<String, String> map) {   //普通类中的泛型方法
			if (map == null || map.isEmpty()) {   //若集合为空则返回空集合给第二个map
				return null;
			}
			Map<String, String> sortedMap = new LinkedHashMap<String, String>();  //设置排序集合
			ArrayList<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(map.entrySet());  //将最初的集合赋给排序集合
			Collections.sort(entryList, new MapValueComparator());   //利用Collections的sort()方法排序
			Iterator<Map.Entry<String, String>> iter = entryList.iterator();  //设置迭代器
			Map.Entry<String, String> tmpEntry = null;   //存放遍历时集合中的下一个元素
			while (iter.hasNext()) {
				tmpEntry = iter.next();
				sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());   //获得排序后的键和值
			}
			return sortedMap;  //返回排序集合
		}
	}
}

class MapValueComparator implements Comparator<Map.Entry<String, String>> {   //根据值进行排序,实现Comparator接口
	public int compare(Entry<String, String> me1, Entry<String, String> me2) {  //重写compare()方法
		return me1.getValue().compareTo(me2.getValue());   //比较前后两个值的大小
	}
}

以上是采用按值排序,过于麻烦,以下是按键排序:

private class MyInnerListener implements ActionListener{  //实现ActionListener接口
		public void actionPerformed(ActionEvent action) {
			String str = "";       //初始输出串
			if(name.getText()!=null && score.getText()!=null) {   //当学生和成绩都已输入文本框
				map.put(scoreText.getText(),nameText.getText());  //将文本框的内容添加进map集合
			}
			Set<String> set = map.keySet();
			for(String ky : set) {
				str += name.getText()+':'+map.get(ky)+'	'+score.getText()+':'+ky+'\n';  //输出字符串
				area.setText("");   //清空上一次文本域的内容
				area.append(str);   //文本域显示排序后的信息
			}
			nameText.setText(null);     //清空文本框
			scoreText.setText(null);
		}
	}
这样泛型方法和Comparator接口就可以省略了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值