一、实验内容
1、编写程序:循环接收用户从键盘输入的多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。
输入案例:
hello
world
hello
JAVA
end
输出案例:
world hello hello JAVA
package ShiYan7;
import java.util.*;
public class JavaTest02 {
public static void main(String[] args) {
TreeSet<String> str = new TreeSet<String>(new Comparator<String>() {
public int compare(String s1, String s2) {
int num = s2.compareTo(s1);
return num == 0 ? 1 :num;
}
});
Scanner sc = new Scanner(System.in);
while(true){
String line = sc.nextLine();
if("end".equals(line)){
break;
}
str.add(line);
}
for (String string : str) {
System.out.print(string+" ");
}
}
}
2、编写程序:有m个人围成一个圈,从1开始报数,报到n的这个人就要退出。然后其他人重新开始从1报数,到n退出。问:最后剩下的是m人中的第几个人。(m>n)
输入案例:100 14
输出案例:最后剩下的是100人中的第92个人
package ShiYan7;
import java.util.Scanner;
import java.util.ArrayList;
public class JavaTest03 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();
for (int i = 1; i <= n; i++) {
list.add(i);
}
int count = 1;
for (int i = 0; list.size() != 1; i++) {
if (i == list.size()) {
i = 0;
}
if (count % x == 0) {
list.remove(i--);
}
count++;
}
System.out.println("最后剩下的是"+n+"人中的第"+list.get(0)+"个人");
}
}
3、编写程序:某班有40个学生,学号为2020042901-2020042940,全部参加Java集合阶段检测,给出所有同学的成绩(可随机产生,范围为60-100),请编写程序将本班各位同学成绩从高往低排序打印输出。
PS:成绩相同时学号较小的优先打印,打印的信息包含学号和成绩。
(注:直接在输入框中输入文字形式的代码,粘贴运行结果截图,不要上传文件)
package ShiYan7;
import java.util.*;
/**
* 描述:从大到小打印学生的:学号+姓名+成绩
*
*/
public class JavaTest1 {
public static void main(String[] args) {
initData();
adjust();
}
private static List<Student> data = new ArrayList<Student>();
static class Student{
private int id;
private String name;
private int score;
public Student(int id,String name,int score){
this.id = id;
this.name = name;
this.score = score;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
public String toString() {
return "学号:" + id +
", 姓名:" + name +
" ,Java集合阶段检测:" + score ;
}
}
public static void initData(){
int j = 10;
Random random = new Random();
for (int i = 0;i < 40;++i){
data.add(new Student(2020042901+i,"同学"+(i+j),random.nextInt(40)+61));
}
}
public static void adjust(){
PriorityQueue<Student> queue = new PriorityQueue<Student>(11, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if (o1.getScore() == o2.getScore()) {
return o1.getId() - o2.getId();
}
return o2.getScore() - o1.getScore();
}
});
Iterator<Student> iterator1 = data.iterator();
while (iterator1.hasNext()){
queue.add(iterator1.next());
}
for (int i = 0; i < 40; i++) {
System.out.println(queue.remove());
}
}
public static void print(){
Iterator<Student> iterator = data.iterator();
while (iterator.hasNext()){
Student next1 = iterator.next();
int id = next1.getId();
String name = next1.getName();
int score = next1.getScore();
System.out.println("学号:"+id+" 姓名:"+name+" ,Java集合阶段检测:"+score);
}
}
}
二、实验结果与分析(包括:输入数据、输出数据、程序效率及正确性等)(此处写清题号与其答案,可截图)
程序运行结果截图如下:
程序运行结果截图如下:
程序运行结果截图如下:
五、问题与讨论
1.ArrayList(数组)
ArrayList是最常用的List实现类,内部通过数组实现,它允许对元素进行快速的随机访问,数组的缺点就是每一个元素之间不能有间隔,当数组的大小不满足时需要进行扩容,就要将已经有的数组的数据复制到新的存储空间中。当ArrayList的中间位置插入或者删除元素时,需要对数组进行复制,移动,代价比较高。因此他适合遍历不适合插入和删除。
2.Vector(数组实现、线程同步)
Vector是数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写入引起的的不一致,但是实现线程同步花费很高,访问它比访问ArrayList慢。
3.LinkList(链表)
LinkedList是用链表实现存储数据,很适合数据的动态插入和删除,随机访问和遍历速度比较慢,另外,他还提供了List接口中没有定义的方法,专门用来操作表头和表尾元素,可以当作堆栈,队列和双向队列使用。
4.Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。