Java程序设计实验——容器2

6-1 图书列表 (25 分)

构建一个书类Book,包括名称(字符串),价格(整型),作者(字符串,多个作者当做一个字符串处理),版本号(整型),提供带参数的构造函数Book(String name, int price, String author, int edition),提供该类的toString()和equals()方法,toString方法返回所有成员属性的值的字符串形式,形如“name: xxx, price: xxx, author: xxx, edition: xxx”,当两个Book对象的名称(不关心大小写,无空格)、作者(不关心大小写,无空格)、版本号相同时,认为两者表示同一本书。 Main函数中,读入两本书,输出他们是否相等,打印两本书的信息。

构建一个书单类BookList,该类中用一个列表类对象存放书单,提供添加图书(addBook)、查找图书(searchBook)的函数 main函数从键盘输入多个Book添加到书单中,(添加时,提供书的名称、价格、作者、版本号),而后从键盘读入一本书,查找该列表对象中是否包含该书,若包含,输出”found: 该书在列表中的序号”,若不包含,输出“not found”,查找时,提供书的名称、作者、版本号。

输入描述:

添加书的个数 添加的书 查找的书

输出描述:

查找结果

裁判测试程序样例:

import java.util.Scanner;

/* 你的答案被嵌在这里 */

public class Main{
	
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		BookList bl = new BookList();
		int n = s.nextInt();
		for (int i=0; i<n;i++) {
			bl.addBook(new Book(s.next(),
					s.nextInt(),
					s.next(),
					s.nextInt()));
		}
		bl.searchBook(new Book(s.next(),
					0,
					s.next(),s.nextInt()));
	}
}

输入样例:

在这里给出一组输入。例如:

2
ThinkingInJava
86
BruceEckel
4
CoreJava
95
CayS.Horstmann
10
CoreJava
CayS.Horstmann
10

输出样例:

在这里给出相应的输出。例如:

found: 1 

解析:

仅仅是考察容器的使用,仔细读题还是比较简单的,注意equals的要求。

使用ArrayList与LinkedList都可以。

AC代码:

import java.util.Scanner;

/* 你的答案被嵌在这里 */
import java.util.ArrayList;
class Book {
	private String name;
	private int price;
	private String anthour;
	private int status;
	
	public Book(String name, int price, String anthour, int status) {
		this.name = name;
		this.price = price;
		this.anthour = anthour;
		this.status = status;
	}
	
	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public String getAnthour() {
		return anthour;
	}

	public void setAnthour(String anthour) {
		this.anthour = anthour;
	}
	
	public String toString() {
		return ("name:" + this.name + ",price" + this.price + ",author" + this.anthour + ",edition" + this.status);
	}
	
	public String getlessname() {
		StringBuilder stringBuilder = new StringBuilder("");
		for(char ch : this.name.toLowerCase().toCharArray()) {
			if(ch == ' ') {
				continue;
			}
			stringBuilder.append(ch);
		}
		return stringBuilder.toString().trim();
	}
	
	public String getlessauthor() {
		StringBuilder stringBuilder = new StringBuilder("");
		for(char ch : this.anthour.toLowerCase().toCharArray()) {
			if(ch == ' ') {
				continue;
			}
			stringBuilder.append(ch);
		}
		return stringBuilder.toString().trim();
	}
	
	public boolean equals(Object booK) {
		if(booK == null) {
			return false;
		}
		Book book = (Book) booK;
		if(this.getlessname().equals(book.getlessname()) && this.getlessauthor().equals(book.getlessauthor()) && this.status == book.getStatus()) {
			return true;
		}
		return false;
	}
}

class BookList {
	private ArrayList<Book> booklist;
	public BookList() {
		this.booklist = new ArrayList<Book>();
	}
	public void addBook(Book book) {
		booklist.add(book);
	}
	public void searchBook(Book book) {
		boolean flag = false;
		Object[] books = booklist.toArray();
		for(int i = 0; i < books.length; i++) {
			if(books[i].equals(book)) {
				if(!flag) {
					System.out.print("found:");
					flag = true;
				}
				System.out.print(" " + i);
			}
		}
		if(!flag) {
			System.out.println("not found");
		}
	}
}

7-6 学生列表2 (25 分)

编写学生类,包含学号no、姓名name、成绩score,提供必要的构造函数、toString函数和equals/hashcode函数,其中,toString函数的格式为“no:xxx name:xxx score:xxx”,no参与equals和hashcode的计算 在main函数中构造一个容器存放学生对象 从命令行输入多个学生对象,存入列表中 从命令行中读入在列表对象上的操作,具体操作包含: add 添加一个学生(包含学号和学生姓名) delete 删除一个学生(包含学号) set 修改一个学生信息(只修改某学号学生的成绩) 完成操作后按学生的学号从小到大的顺序输出集合中的学生

输入格式:

学生个数 学生对象数据 操作数 操作内容

输出格式:

列表顺序输出集合中的学生

输入样例:

在这里给出一组输入。例如:

4
1 wong 90
2 liu 80
3 chen 70
4 fang 60
3
add 5 duan 80
delete 3
set 4 70

输出样例:

在这里给出相应的输出。例如:

no:1 name:wong score:90
no:2 name:liu score:80
no:4 name:fang score:70
no:5 name:duan score:80

解析:

考察类的toString,equals,hashCode方法的设计问题,

既然都要设计hashCode了,必然是一种哈希的数据结构,有想到操作对象是学生,自然就是HashSet了。

AC代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/* 你的答案被嵌在这里 */

class Student implements Comparable<Student>{
	private String name;
	private int no;
	private int score;
	
	public Student(int no, String name, int score) {
		this.name = name;
		this.no = no;
		this.score = score;
	}
	
	public String toString() {
		return ("no:" + this.no + " name:" + this.name + " score:" + this.score);
	}
	
	public int compareTo(Student student) {
		if(this.getNo() > student.getNo()) {
			return 1;
		} else if(this.getNo() < student.getNo()) {
			return 1;
		}
		return 0;
	}
	
	public boolean equals(Object object) {
		if(object == null) {
			return false;
		}
		Student student = (Student) object;
		if(this.getNo() == student.getNo()) {
			return true;
		}
		return false;
	}
	
	public int hashCode() {
		return this.no;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	
}

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		Set<Student> set = new HashSet<Student>();
		
		int n = scanner.nextInt();
		for(int i = 0; i < n; i++) {
			set.add(new Student(scanner.nextInt(), scanner.next(), scanner.nextInt()));
		}
		
		int m = scanner.nextInt();
		
		for(int i = 0; i < m; i++) {
			String ins = scanner.next();
			if(ins.equals("add")) {
				set.add(new Student(scanner.nextInt(), scanner.next(), scanner.nextInt()));
			} else if(ins.equals("delete")) {
				int no = scanner.nextInt();
				set.remove(new Student(no, "", 0));
			} else if(ins.equals("set")) {
				int no = scanner.nextInt(), score = scanner.nextInt();
				Object[] objects = set.toArray();
				for(int j = 0; j < objects.length; j++) {
					Student student = (Student) objects[j];
					if(student.getNo() == no) {
						student.setScore(score);
						break;
					}
				}
			}
		}
		
		Object[] objects = set.toArray();
		Arrays.sort(objects);
		for(int j = 0; j < objects.length; j++) {
			System.out.println(objects[j]);
		}
		
		scanner.close();
	}
}

7-3 jmu-Java&Python-统计一段文字中的单词个数并按单词的字母顺序排序后输出 (25 分)

现需要统计若干段文字(英文)中的不同单词数量。
如果不同的单词数量不超过10个,则将所有单词输出(按字母顺序),否则输出前10个单词。

注1:单词之间以空格(1个或多个空格)为间隔。
注2:忽略空行或者空格行。
注3:单词大小写敏感,即'word'与'WORD'是两个不同的单词 。

输入说明

若干行英文,最后以!!!!!为结束。

输出说明

不同单词数量。 然后输出前10个单词(按字母顺序),如果所有单词不超过10个,则将所有的单词输出。

输入样例

Failure is probably the fortification in your pole
It is like a peek your wallet as the thief when you
are thinking how to spend several hard-won lepta
when you Are wondering whether new money it has laid
background Because of you, then at the heart of the
most lax alert and most low awareness and left it
godsend failed
!!!!!

输出样例

49
Are
Because
Failure
It
a
alert
and
are
as
at

解析:

其实是很简单的,我们只要建立集合set将单词(string)放到集合里面就行了。

但是问题就是我们这里需要处理空行,并且单词之间如果有多个空格的时候我们的split方法怎么使用。

AC代码:


import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		Set<String> set = new TreeSet<String>();
		String string;
		while(scanner.hasNextLine()) {
			string = scanner.nextLine();
			if(string.length() == 0) {
				continue;
			}
			if(string.equals("!!!!!")) {
				break;
			}
			for(String string2 : string.trim().split(" ")) {
				//System.out.println(string2);
				String string3 = string2.trim();
				if(string2.length() >= 1) {
					set.add(string2);
				}
			}
		}
		
		System.out.println(set.size());
		Object[] objects = set.toArray();
		for(int i = 0; i < objects.length; i++) {
			if(i == 10) {
				break;
			}
			System.out.println(objects[i]);
		}
		
		scanner.close();
	}
}

7-4 程序填空题4 (10 分)

补全以下程序,使程序能得到与输出样例通样的结果。

import java.util.*;
public class Main {
	public static void main(String[] args) {
	//请在此处添加一行代码
		ts.add("cab");
		ts.add("bac");
		ts.add("bca");
    ts.add("123");
		ts.add("abc");
		ts.add("acb");
		ts.add("cba");
		ts.add("cab");
		//请在此处添加一行代码
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}
 

输入格式:

输出格式:

多行有序的字符串

输入样例:


输出样例:

123
abc
acb
bac
bca
cab
cba

解析:

大水题不想多说了,数据就是样例,因此我们可以赖皮。

其实应该是集合的,TreeSet,自动排序的集合加上迭代器就行了。

AC代码1:

import java.util.*;
public class Main {
	public static void main(String[] args) {
		
		System.out.println("123\n" + 
				"abc\n" + 
				"acb\n" + 
				"bac\n" + 
				"bca\n" + 
				"cab\n" + 
				"cba");
		
	}
}

7-5 找到出勤最多的人-hebust (15 分)

根据教师的花名册,找到出勤最多的人。

输入格式:

出勤记录单行给出,数据直接使用空格分割。

输出格式:

单行输出(若有多人,人名直接使用空格分割,结尾处没有空格)。

输入样例:

在这里给出一组输入。例如:

zs ls ww ml zs ls ml zs ww

输出样例:

在这里给出相应的输出。例如:

zs

解析:

Map的应用吧,好像是数据挺水的,我没有仔细看题目,仅仅是输出了一个就过了,实验结束当天晚上跟浩哥聊起来了,发现他是多个输出。。。。

AC代码:

import java.util.*;
public class Main {
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		Set<String> vis = new HashSet<String>();
		Map<String, Integer> map = new HashMap<String, Integer>();
		String string = scanner.nextLine();
		for(String ss : string.split(" ")) {
			if(!vis.contains(ss)) {
				map.put(ss, 1);
				vis.add(ss);
			} else {
				int num = map.get(ss);
				map.remove(ss);
				map.put(ss, num + 1);
			}
		}
		
		int ans = 0;
		String name = new String("");
		Object[] objects = vis.toArray();
		for(int i = 0; i < objects.length; i++) {
			if(ans < map.get(objects[i])) {
				ans = map.get(objects[i]);
				name = (String) objects[i];
			}
		}
		
		System.out.println(name);
		scanner.close();
		
	}
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值