我需要编写一个程序,可以对10名参赛者的比赛时间进行排名 所以我创建了2个数组
跑步者的身份证(10名跑步者)
10名选手的比赛时间(比赛时间必须小于或等于20.0秒)
我发现我的排序算法无法正确使用,我不想使用Arrays.sort(x);
,因为我需要排序“那些比赛时间和ID”这里是我的代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] ID = new String[10];
double[] time = new double[10];
for (int i = 0; i < ID.length; i++) {
System.out.print("Please enter ID and times: ");
ID[i] = sc.nextLine();
time[i] = sc.nextDouble();
}
Run a = new Run(ID, time);
System.out.println("Top 3 is ");
a.Sort();
}
}
和
public class Run {
private String[] ID = new String[10];
private double[] time = new double[10];
public Run(String[] ID, double[] time) {
for (int i = 0; i < ID.length; i++) {
this.ID[i] = ID[i];
}
for (int i = 0; i < time.length; i++) {
if (time[i] <= 20.0) {
this.time[i] = time[i];
}
}
}
public void Sort() {
double tem1;
String tem2;
for (int i = 0; i < time.length; i++) {
for (int j = 0; j < time.length; j++) {
if (time[j] > time[j+1]) {
tem1 = time[j];
time[j] = time[j+1];
time[j+1] = tem1;
tem2 = ID[j];
ID[j] = ID[j+1];
ID[j+1] = tem2;
}
}
}
for (int i = 0; i < 3; i++) {
System.out.println(ID[i] + " " + time[i]);
}
}
}
所以我需要知道为什么我的排序算法无法正确使用,它在我的控制台上弹出错误。
还有一个问题,在我输入第一个ID和时间的输入阶段,如果我按这样按
ID [0] - &gt;输入 - &gt;时间[0]
然后输入正确但是如果我按
ID [0] - &gt;空格键 - &gt;时间[0]
然后输入错误。 为什么?我该如何解决?
答案 0 :(得分:0)
我看到的第一件事是你在Run
的构造函数中传递了一个包含10个元素的数组;这不是必需的,你可以直接传递数组:
主要:
Run a = new Run(ID, time);
在跑步中:
public Run(String[] ID, double[] time) {
this.ID = ID;
this.time = time;
}
您可以发布错误日志吗?
请阅读此处了解阅读输入时遇到的问题:Read integers and strings from a single line of a console
问题是你试图进入一个不存在的数组单元格:array.length
返回数组的长度,因此在这种情况下返回10.
你正在进行从0到10的循环,然后你试图在time[11]
内(在time[j+1]
内)(在 for (int i = 0; i < time.length - 1; i++) {
for (int j = 0; j < time.length - 1; j++) {
System.out.println(i + " "+ j);
if (time[j] > time[j+1]) {
tem1 = time[j];
time[j] = time[j+1];
time[j+1] = tem1;
tem2 = ID[j];
ID[j] = ID[j+1];
ID[j+1] = tem2;
}
}
}
中)。
将for循环更改为:
getNoBackupFilesDir
答案 1 :(得分:0)
@ Pleasant94回答了有关索引错误的问题。
要在输入ID后回答关于为什么需要输入新行(按Enter键)的问题是因为您使用nextLine()
将整行扫描到ID值。而不是像nextInt()
一样使用nextDouble()
。
...
ID[i] = sc.nextInt();
time[i] = sc.nextDouble();
...
在此处查看扫描仪类的Java文档:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
因为您现在正在使用int进行扫描,所以您必须将所有ID变量更新为int。将它与Pleasant94的答案结合起来,您应该能够做到这一点:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] ID = new int[10];
double[] time = new double[10];
for (int i = 0; i < ID.length; i++) {
System.out.print("Please enter ID and times: ");
ID[i] = sc.nextInt();
time[i] = sc.nextDouble();
}
Run a = new Run(ID, time);
System.out.println("Top 3 is ");
a.Sort();
}
}
class Run {
private int[] ID = new int[10];
private double[] time = new double[10];
public Run(int[] ID, double[] time) {
for (int i = 0; i < ID.length; i++) {
this.ID[i] = ID[i];
}
for (int i = 0; i < time.length; i++) {
if (time[i] <= 20.0) {
this.time[i] = time[i];
}
}
}
public void Sort() {
double tem1;
int tem2;
for (int i = 0; i < time.length - 1; i++) {
for (int j = 0; j < time.length - 1; j++) {
if (time[j] > time[j+1]) {
tem1 = time[j];
time[j] = time[j+1];
time[j+1] = tem1;
tem2 = ID[j];
ID[j] = ID[j+1];
ID[j+1] = tem2;
}
}
}
for (int i = 0; i < 3; i++) {
System.out.println(ID[i] + " " + time[i]);
}
}
}