第十四周java作业--Java集合框架

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

程序实现代码:

package week14;
import java.util.ArrayList;
import java.util.List;

public class Book implements Comparable{
	private String name;
	private float price;
	
	public Book(String name,float price){
		this.name=name;
		this.price=price;
	}
	public static void main(String[] args) {
		List<Book> list =new ArrayList<Book>();
		Book b1 = new Book("java基础教程", 30.0f);
		Book b2 = new Book("数据库技术", 29.0f);
		Book b3 = new Book("C++基础教程", 28.0f);
		list.add(b1);
		list.add(b2);
		list.add(b3);
		System.out.println("创建一个新的book对象");
		Book b4 =new Book("模式识别", 29.0f);
		System.out.println("新书"+b4.name+"与下列图书:");
		for(int i=0;i<list.size();i++){
			 Book book = (Book)list.get(i); 
			 int index = book.compareTo(b4);
			 if (index ==0 ) {
				
				 System.out.println(book.name);
			}
		}
		System.out.print("相同"+"具体价格为"+b4.price+"元");
	}
	public int compareTo(Object obj) {
		Book p =(Book)obj;
		if(p.price>this.price){
			return 1;
		}else if(p.price<this.price){
			return -1;
		}else
		return 0;
	}
}

运行截图:
这里写图片描述

注:这个题最简单的方法是改一下课本448页的代码,具体的自己翻书抄

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

程序实现代码:

package week14;

import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,
 * 程序按成绩排序将这些学生的姓名和分数显示在一个文本区中
 * @author Lenovo_PC
 *
 */
public class Test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyJframe myJframe = new MyJframe();//显示窗口
	}

}


class MyJframe extends JFrame implements ActionListener{
	JFrame mJFrame;
	JTextField mJTextField1;
	JTextField mJTextField2;
	JTextArea mJTextArea;
	MyJframe(){
		mJFrame = new JFrame("成绩排序");
		mJFrame.setBounds(200, 100, 900, 600);//设置窗口位置及窗口的宽高
		mJFrame.setLayout(new FlowLayout());//设置窗口的布局
		mJTextField1 = new JTextField(10);//显式创建两个文本框
		mJTextField2 = new JTextField(10);
		JButton mJButton = new JButton("插入");//创建按钮
		Box mBox = Box.createHorizontalBox();//创建横向盒容器
		mBox.add(new Label("姓名:"));//添加隐式创建的标签,因为不需要点击事件所以隐式创建即可
		mBox.add(mJTextField1);//所有add均为向父容器中添加
		mBox.add(Box.createHorizontalStrut(50));//设置横向的间隔
		mBox.add(new Label("分数:"));
		mBox.add(mJTextField2);
		mBox.add(Box.createHorizontalStrut(50));
		mBox.add(mJButton);
		mJFrame.add(mBox);
		mJTextArea = new JTextArea(40,80);//创建文本区域,用来显示输出,所以必须显式创建
		mJTextArea.setText("自己在上边写数据,点插入\n");
		mJFrame.add(mJTextArea);
		mJFrame.setVisible(true);//使窗口显式出来
		mJButton.addActionListener(this);
	}
	
	List<Student> list = new ArrayList<Student>();

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		/*
		 * 因为只有button有点击事件,所以直接可以不用判断,若有多个控件绑定了事件则需要判断
		 * 这里直接判断文本框是否为空
		 */
		mJTextArea.setText("");
		String name = mJTextField1.getText().trim();
		String grade = mJTextField2.getText().trim();
		if(!"".equals(name) && !"".equals(grade)){
			try {
				list.add(new Student(name, Float.parseFloat(grade)));
				mJTextArea.append("当前插入的信息为:姓名:"+name+"    成绩:"+grade+"\n");
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				mJTextArea.append("不知道成绩是数字格式吗,重新输入!\n");
			}
		}
		Collections.sort(list);//对list排序
		Iterator<Student> iterator = list.iterator();
		Student student;
		while (iterator.hasNext()) {
			student = iterator.next();
			mJTextArea.append("name:"+student.name+"    grade:"+student.grade+"\n");
		}
	}
}

class Student implements Comparable<Student>{
	
	String name;
	float grade;
	
	public Student(String name, float grade) {
		super();
		this.name = name;
		this.grade = grade;
	}

	@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
		return (int) (o.grade*10 - this.grade*10);//保证一位小数的情况下比较的准确性
	}
	
}

运行截图:
这里写图片描述

针对第二题的优化:
先说哪里做了优化,刚开始自己的JFrame手动指定了FlowLayout的布局,优化后JFrame使用默认的BorderLayout布局,JFrame中也有Box盒对象转变成了JPanel和JScrollPane,JPanel默认了FlowLayout布局,另外mJScrollPane.add(mJTextArea);是错误的,必须mJScrollPane = new JScrollPane(mJTextArea);,而且优化后无须指定textarea的大小,自动占满父容器,上一个代码这里做的不行,另外采用了本身就有序的treeSet来进行数据的存储,但是set类的集合不允许出现重复的元素,解决办法在compareTo()方法中做修改,当然也可以和第一遍的写法一样,用ArrayList来存储,只需多加一步Collections.sort(list);//对list排序

package demo04_tjw;

import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.TreeSet;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,
 * 程序按成绩排序将这些学生的姓名和分数显示在一个文本区中
 * @author Lenovo_PC
 *
 */
public class Test3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyJframe myJframe = new MyJframe();//显示窗口
	}

}


class MyJframe extends JFrame implements ActionListener{
	JFrame mJFrame;
	JTextField mJTextField1;
	JTextField mJTextField2;
	JTextArea mJTextArea;
	JPanel mJPanel;
	JScrollPane mJScrollPane;
	JButton mJButton;
	MyJframe(){
		mJFrame = new JFrame("成绩排序");
		mJFrame.setBounds(200, 100, 900, 600);//设置窗口位置及窗口的宽高
		mJTextField1 = new JTextField(10);//显式创建两个文本框
		mJTextField2 = new JTextField(10);
		mJButton = new JButton("插入");//创建按钮
		mJPanel = new JPanel();
		
		mJPanel.add(new Label("姓名:"));
		mJPanel.add(mJTextField1);
		mJPanel.add(new Label("分数:"));
		mJPanel.add(mJTextField2);
		mJPanel.add(mJButton);
		
		mJTextArea = new JTextArea();//创建文本区域,用来显示输出,所以必须显式创建
		mJTextArea.setText("自己在上边写数据,点插入\n");
		mJScrollPane = new JScrollPane(mJTextArea);//不能用add!!
		
		mJFrame.add(mJPanel,BorderLayout.NORTH);
		mJFrame.add(mJScrollPane,BorderLayout.CENTER);
		mJFrame.setVisible(true);//使窗口显式出来
		mJButton.addActionListener(this);
	}
	
	TreeSet<Student> treeSet = new TreeSet<Student>();

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		/*
		 * 因为只有button有点击事件,所以直接可以不用判断,若有多个控件绑定了事件则需要判断
		 * 这里直接判断文本框是否为空
		 */
		mJTextArea.setText("");
		String name = mJTextField1.getText().trim();
		String grade = mJTextField2.getText().trim();
		if(!"".equals(name) && !"".equals(grade)){
			try {
				treeSet.add(new Student(name, Float.parseFloat(grade)));//set集合不允许有重复的数据,解决是在compareTo()方法中
				mJTextArea.append("当前插入的信息为:姓名:"+name+"    成绩:"+grade+"\n");
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				mJTextArea.append("不知道成绩是数字格式吗,重新输入!\n");
			}
		}
		Iterator<Student> iterator = treeSet.iterator();
		Student student;
		while (iterator.hasNext()) {
			student = iterator.next();
			mJTextArea.append("name:"+student.name+"    grade:"+student.grade+"\n");
		}
	}
}

class Student implements Comparable<Student>{
	
	String name;
	float grade;
	
	public Student(String name, float grade) {
		super();
		this.name = name;
		this.grade = grade;
	}

	@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
		if ((int) (o.grade*10 - this.grade*10) == 0) {
			return 1;//这里加上后可以存储重复数据
		}else{
			return (int) (o.grade*10 - this.grade*10);//保证一位小数的情况下比较的准确性
		}
	}
	
}

考前的最后一遍优化,每次读自己的代码总会发现各种小问题,这次变动很小,去掉JFrame子类中的mJFrame变量,因为在Jframe子类的构造方法里再new一个窗口,自己觉得有点不伦不类,这里为了完整也重新粘贴一下代码,希望是最后一次修改

package demo04_tjw;

import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,
 * 程序按成绩排序将这些学生的姓名和分数显示在一个文本区中
 * @author Lenovo_PC
 *
 */
public class Test3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyJframe myJframe = new MyJframe();//显示窗口
	}

}


class MyJframe extends JFrame implements ActionListener{
	JTextField mJTextField1;
	JTextField mJTextField2;
	JTextArea mJTextArea;
	JPanel mJPanel;
	JScrollPane mJScrollPane;
	JButton mJButton;
	MyJframe(){
		//super("成绩排序");//这种写法也可以
		setTitle("成绩排序");
		setBounds(200, 100, 900, 600);//设置窗口位置及窗口的宽高
		mJTextField1 = new JTextField(10);//显式创建两个文本框
		mJTextField2 = new JTextField(10);
		mJButton = new JButton("插入");//创建按钮
		mJPanel = new JPanel();
		
		mJPanel.add(new Label("姓名:"));
		mJPanel.add(mJTextField1);
		mJPanel.add(new Label("分数:"));
		mJPanel.add(mJTextField2);
		mJPanel.add(mJButton);
		
		mJTextArea = new JTextArea();//创建文本区域,用来显示输出,所以必须显式创建
		mJTextArea.setText("自己在上边写数据,点插入\n");
		mJScrollPane = new JScrollPane(mJTextArea);//不能用add!!
		
		add(mJPanel,BorderLayout.NORTH);
		add(mJScrollPane,BorderLayout.CENTER);
		setVisible(true);//使窗口显式出来
		mJButton.addActionListener(this);
	}
	
	List<Student> list = new ArrayList<Student>();

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		/*
		 * 因为只有button有点击事件,所以直接可以不用判断,若有多个控件绑定了事件则需要判断
		 * 这里直接判断文本框是否为空
		 */
		mJTextArea.setText("");
		String name = mJTextField1.getText().trim();
		String grade = mJTextField2.getText().trim();
		if(!"".equals(name) && !"".equals(grade)){
			try {
				list.add(new Student(name, Float.parseFloat(grade)));//set集合不允许有重复的数据,解决是在compareTo()方法中
				mJTextArea.append("当前插入的信息为:姓名:"+name+"    成绩:"+grade+"\n");
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				mJTextArea.append("不知道成绩是数字格式吗,重新输入!\n");
			}
		}
		Collections.sort(list);//对list排序
		Iterator<Student> iterator = list.iterator();
		Student student;
		while (iterator.hasNext()) {
			student = iterator.next();
			mJTextArea.append("name:"+student.name+"    grade:"+student.grade+"\n");
		}
	}
}

class Student implements Comparable<Student>{
	
	String name;
	float grade;
	
	public Student(String name, float grade) {
		super();
		this.name = name;
		this.grade = grade;
	}

	@Override
	public int compareTo(Student o) {
		// TODO Auto-generated method stub
		return (int) (o.grade*10 - this.grade*10);//保证一位小数的情况下比较的准确性
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值