1 编写一个Book类,该类至少有name和price两个属性。该类要实现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接口就可以省略了