我的第四个for循环,对于(int y),一遍又一遍地打印前m个元素,我该如何修复它以便一次打印m个元素但不是相同的?
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
ArrayList<String> myname = new ArrayList<String>(n);
ArrayList<Integer> myscore = new ArrayList<Integer>(m);
for (int i = 0; i < n; i++) { //swimmers
myname.add(input.next());
for (int j = 0; j < m; j++) { //judges
myscore.add(input.nextInt());
}
}
for (int x = 0; x < n; x++) { //name
System.out.println(myname.get(x));
for (int y = 0; y < m; y++) { //score
System.out.println(myscore.get(y));
}
}
答案 0 :(得分:2)
因为您的myscore
长度n*m
不仅仅是m
n
。您将在列表末尾添加每个分数。
因此,列表中有m
个for(int y = x * m, to = x*m + m; y < to; ++y){
System.out.println(myscore.get(y));
}
个元素块。您仍然可以使用
[assembly: AssemblyVersion("1.0.*")]
答案 1 :(得分:2)
根据你的代码,你似乎有'n'个游泳运动员,每个人都有'm'分数。你将'n'游泳者的名字存储在一个ArrayList中,这很糟糕,因为你知道这个数字永远不会改变。更好的方法是将myname声明为大小为n的String [],而不是调用myname.get(x),以后调用myname [x]。 然而,这只是与手头问题有关的症状。您将所有得分结果存储在单个ArrayList中。一个更好的解决方案是生成'n'个数组(这是我假设你想根据这个问题的标题做的)。这可以通过简单地声明来完成 allScores [] [] = new int [n] [m]
这将允许您使用allScores [n]访问游泳者编号'n'的值。如果这不是您真正想要做的,那么您可以简单地将上一个get语句中的值与您已经处理的分数(x * n)相对应。
TLDR:将最后一个for循环中的行更改为: System.out.println(myscore.get(y + x * n)
答案 2 :(得分:1)
class ScoreHolder{
String name = "";
ArrayList<Integer> scores = new ArrayList<Integer>;
public ScoreHolder(String name){
this.name = name
}
}
然后
ScoreHolder[] scores = new ScoreHolder[n];
for (int i = 0; i < n; i++) { //swimmers
scores[i] = new ScoreHolder(input.next());
for (int j = 0; j < m; j++) { //judges
scores[i].scores.add(input.nextInt());
}
}
for (int x = 0; x < n; x++) { //name
System.out.println(scores[x].name);
for (int y = 0; y < m; y++) { //score
System.out.println(scores[x].scores.get(y));
}
}
现在不仅容易使用,而且更容易做出任何改变或做任何你想做的事情。
我所做的只是创建一个持有者类,它将保留游泳者的名字和他所有分数的列表。
这种抽象现在可以帮助你获得游泳运动员的分数或做任何你想要的东西。