本篇是参加学校开设的java资讯班的作业,由於对於笔者来说花蛮多时间的,所以想记录下来解题的过程,以供後续参考。
题目:请随机产生一群可疑接触的人群,并编号(ID),同时请他们纪录接触别人的号码是多少,假设他们接触的人都只有一人并且不会重覆;之後随机选择一个人为染疫者,并请找出相关传播链的人。如下图:
难题一:如何乱数取值不重覆。
刚开始尚未学习method,虽然网路上有一篇文章有写到[Java]产生不重复之乱数,但是在method回传应用上,还是一知半解。
後来回头看上课讲义,发现利用shuffle algorithm的swap即可。
System.out.println("Enter number of citizens");
Scanner citizens = new Scanner(System.in);
int c = citizens.nextInt(); //指定团体人数有几人
int[] C = new int[c];
System.out.printf("%9s", "ID");
for (int i = 0; i < C.length; i++) {
System.out.printf("%3d", i);
}
;
System.out.println();
int[] Contactee;
Contactee = new int[c];
for (int i = 0; i < Contactee.length; i++) {
Contactee[i] = i;
}
;
//以下乱数取值不重覆
for (int i = 0; i < Contactee.length - 1; i++) {
int m = (int) (Math.random() * (Contactee.length - i) + i);
int temp = Contactee[i];
Contactee[i] = Contactee[m];
Contactee[m] = temp;
}
难题之二:如何串联ID与接触者的关系。
虽然在纸上拆解流程都没问题,但是因为对於本题在while及for回圈之间的关系,及语法不熟练,想通前要死不活,想通後不禁佩服自己的蠢。
import java.util.Scanner;
public class ContagionControl {
public static void main(String[] args) {
// part2开始
System.out.println();
System.out.println("Enter id of infected citizen :"); //指定一个ID为传染源头。
Scanner id = new Scanner(System.in);
int idnumber = id.nextInt();
int enternumber = idnumber; //纪录传染链的头,方便後面对比使否为传染链的尾。
System.out.println("These citizens are to br self-isolated in the following 14 days:");
System.out.printf("%d",idnumber);
//ID与接触者关系
while (Contactee[idnumber] != enternumber) {
for (int i = 0; i < C.length; i++) {
if (Contactee[idnumber] == i) {
System.out.printf("%3d", i);
idnumber = i;
}
;
}
;
if(Contactee[idnumber] == enternumber) { //当尾巴连到传染链的头,等於结束传染链。
break;
};
}
;
id.close();
citizens.close();
};
}
全部的code
import java.util.Scanner;
public class ContagionControl {
public static void main(String[] args) {
System.out.println("Enter number of citizens");
Scanner citizens = new Scanner(System.in);
int c = citizens.nextInt();
int[] C = new int[c];
System.out.printf("%9s", "ID");
for (int i = 0; i < C.length; i++) {
System.out.printf("%3d", i);
}
;
System.out.println();
int[] Contactee;
Contactee = new int[c];
for (int i = 0; i < Contactee.length; i++) {
Contactee[i] = i;
}
;
for (int i = 0; i < Contactee.length - 1; i++) {
int m = (int) (Math.random() * (Contactee.length - i) + i);
int temp = Contactee[i];
Contactee[i] = Contactee[m];
Contactee[m] = temp;
}
;
System.out.printf("%5s", "Contactee");
for (int i = 0; i < C.length; i++) {
System.out.printf("%3d", Contactee[i]);
}
;
System.out.println();
System.out.println("-----------------------");
// part2
System.out.println();
System.out.println("Enter id of infected citizen :"); //指定一个ID为传染源头。
Scanner id = new Scanner(System.in);
int idnumber = id.nextInt();
int enternumber = idnumber; //纪录传染链的头,方便後面对比使否为传染链的尾。
System.out.println("These citizens are to br self-isolated in the following 14 days:");
System.out.printf("%d",idnumber);
//ID与接触者关系
while (Contactee[idnumber] != enternumber) {
for (int i = 0; i < C.length; i++) {
if (Contactee[idnumber] == i) {
System.out.printf("%3d", i);
idnumber = i;
}
;
}
;
if(Contactee[idnumber] == enternumber) { //当尾巴连到传染链的头,等於结束传染链。
break;
};
}
;
id.close();
citizens.close();
};
}
参考文章:
Scroll Animation 卡片滑动载入效果(原生JS版) CodePen: https://...
听说,这个书名引发了一些争议。老板角色的人看这本书都认为RD团队读完後就是吃了大补丸,以後做专案只需...
教材网址 https://coding104.blogspot.com/2021/06/java-o...
在很多情况下,我们的任务前后之间没有必然的联系的,所以我们可以不需要等待前面命令结束,才开始后面的任...
前言 串连行情的部分OK了,我们再回到盘後资讯,这是要使用的是Scanners。 参考网站:Stoc...