Java递增编号
Java incrementation numbering
问题是我无法正确显示输出。
输入:
6
贝里克 78
Zeynep 100
萨尼亚 75
道莱特 45
阿拜 96
安德烈 75
预期输出:
1) Zeynep: 100
2) Abay: 96
3) Berik: 78
4) Saniya: 75
5) Andrey: 75
6) Daulet: 45
我的输出:
1) Zeynep: 100
2) Abay: 96
3) Berik: 78
4) Saniya: 75
4) Andrey: 75
5) Daulet: 45
如您所见,编号不正确。当两点相等时,错误必须在增量逻辑中的某个地方。我将编号作为参数传递给 printMax 方法
import java.util.ArrayList;
import java.util.Scanner;
public class a1_t13 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
ArrayList<Integer> scores_unsorted = new ArrayList<>();
ArrayList<String> names_unsorted = new ArrayList<>();
for (int i=0; i<num; i++) {
String value = input.next();
int numValue = input.nextInt();
scores_unsorted.add(numValue);
names_unsorted.add(value);
}
int b = 1;
for (int z = 0; z<num;z++) {
int c = getMax(scores_unsorted);
printMax(c, names_unsorted, scores_unsorted, b);
b++; //<================ HERE I'M DOING AN INCREMENTATION
}
}
public static int getMax(ArrayList list) {
int max = 0;
for(int i=0;i<list.size();i++) {
if (max< (int)list.get(i)) {
max = (int) list.get(i);
}
}
return max;
}
public static void printMax(int score, ArrayList names_unsorted, ArrayList scores_unsorted, int order) {
for (int i=0;i<names_unsorted.size();i++) {
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order+")"+names_unsorted.get(score_index).toString()+": "+score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
}
}
}
}
问题出在您的 printMax
方法中,因为您遍历了所有名称并且其中两个具有相同的计数,并且您使用相同的订单号打印了这两个名称。如果您在第一次找到后打破循环,它将起作用。
public static void printMax(int score, ArrayList names_unsorted, ArrayList scores_unsorted, int order) {
for (int i = 0; i < names_unsorted.size(); i++) {
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order + ")" + names_unsorted.get(score_index).toString() + ": " + score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
break;
}
}
}
问题在于,在 printMax 函数中,即使您找到并打印了您正在搜索的最大记录并且在退出循环后增加了 b 的值,您也会遍历整个数组。让它按你想要的方式工作的最简单方法是将 break 放在 if body:
的末尾
public static void printMax(int score, ArrayList names_unsorted, ArrayList scores_unsorted, int order) {
for (int i=0;i<names_unsorted.size();i++) {
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order+")"+names_unsorted.get(score_index).toString()+": "+score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
break;
}
}
}
删除 100、96 和 78 后,两个列表都有 3 个元素。
现在75是最大值
printMax(c, names_unsorted, scores_unsorted, b) 方法在 c=75 和 b = 4 时被调用。
现在在 printMax() 中,这个条件对两个元素为真:
if ((int) scores_unsorted.get(i) == score)
因为现在分数是 75 并且列表中也有两个 75。所以如果已经找到一个,你应该打破循环。
你的 if 条件块应该是这样的:
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order+")"+names_unsorted.get(score_index).toString()+": "+score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
break;
}
问题是我无法正确显示输出。
输入:
6
贝里克 78
Zeynep 100
萨尼亚 75
道莱特 45
阿拜 96
安德烈 75
预期输出:
1) Zeynep: 100
2) Abay: 96
3) Berik: 78
4) Saniya: 75
5) Andrey: 75
6) Daulet: 45
我的输出:
1) Zeynep: 100
2) Abay: 96
3) Berik: 78
4) Saniya: 75
4) Andrey: 75
5) Daulet: 45
如您所见,编号不正确。当两点相等时,错误必须在增量逻辑中的某个地方。我将编号作为参数传递给 printMax 方法
import java.util.ArrayList;
import java.util.Scanner;
public class a1_t13 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = input.nextInt();
ArrayList<Integer> scores_unsorted = new ArrayList<>();
ArrayList<String> names_unsorted = new ArrayList<>();
for (int i=0; i<num; i++) {
String value = input.next();
int numValue = input.nextInt();
scores_unsorted.add(numValue);
names_unsorted.add(value);
}
int b = 1;
for (int z = 0; z<num;z++) {
int c = getMax(scores_unsorted);
printMax(c, names_unsorted, scores_unsorted, b);
b++; //<================ HERE I'M DOING AN INCREMENTATION
}
}
public static int getMax(ArrayList list) {
int max = 0;
for(int i=0;i<list.size();i++) {
if (max< (int)list.get(i)) {
max = (int) list.get(i);
}
}
return max;
}
public static void printMax(int score, ArrayList names_unsorted, ArrayList scores_unsorted, int order) {
for (int i=0;i<names_unsorted.size();i++) {
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order+")"+names_unsorted.get(score_index).toString()+": "+score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
}
}
}
}
问题出在您的 printMax
方法中,因为您遍历了所有名称并且其中两个具有相同的计数,并且您使用相同的订单号打印了这两个名称。如果您在第一次找到后打破循环,它将起作用。
public static void printMax(int score, ArrayList names_unsorted, ArrayList scores_unsorted, int order) {
for (int i = 0; i < names_unsorted.size(); i++) {
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order + ")" + names_unsorted.get(score_index).toString() + ": " + score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
break;
}
}
}
问题在于,在 printMax 函数中,即使您找到并打印了您正在搜索的最大记录并且在退出循环后增加了 b 的值,您也会遍历整个数组。让它按你想要的方式工作的最简单方法是将 break 放在 if body:
的末尾public static void printMax(int score, ArrayList names_unsorted, ArrayList scores_unsorted, int order) {
for (int i=0;i<names_unsorted.size();i++) {
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order+")"+names_unsorted.get(score_index).toString()+": "+score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
break;
}
}
}
删除 100、96 和 78 后,两个列表都有 3 个元素。 现在75是最大值
printMax(c, names_unsorted, scores_unsorted, b) 方法在 c=75 和 b = 4 时被调用。
现在在 printMax() 中,这个条件对两个元素为真:
if ((int) scores_unsorted.get(i) == score)
因为现在分数是 75 并且列表中也有两个 75。所以如果已经找到一个,你应该打破循环。
你的 if 条件块应该是这样的:
if ((int) scores_unsorted.get(i) == score) {
int score_index = scores_unsorted.indexOf(Integer.valueOf(score));
System.out.println(order+")"+names_unsorted.get(score_index).toString()+": "+score);
scores_unsorted.remove(score_index);
names_unsorted.remove(score_index);
break;
}