在整个程序中调用record()方法。所以如果用户输入 1,2,3,4,5,6,7。按顺序,它打印出7,6,5,4,3,2,1。我已经尝试过增强的for循环,forloops增量等等。请帮忙,在此先感谢。
ArrayList<Integer> playerMoves = new ArrayList<Integer>(20);
public void record(int value) {
playerMoves.add(0, value);
if(playerMoves.size() > 20) {
playerMoves.remove(playerMoves.size() - 1);
}
}
public void displayPlayerMoves() {
int fullstopCount = 20;
System.out.print(playerMoves.size() + " moves: ");
for(int i = playerMoves.size(); i > 0; i--) {
fullstopCount--;
if(playerMoves.size() == fullstopCount) {
System.out.print(playerMoves.get(i) + ".");
} else {
System.out.print(playerMoves.get(i) + ", ");
}
}
}
答案 0 :(得分:1)
您要在列表的第一个位置添加每个元素:
playerMoves.add(0, value);
表示您正在创建一个列表,其顺序与插入顺序相反。
如果您将其更改为:
playerMoves.add(value);
它会将每个元素添加到列表的末尾,这也会导致列表按插入顺序打印。
如果您进行了更改,则还应更改
if(playerMoves.size() > 20) {
playerMoves.remove(playerMoves.size() - 1);
}
到
if(playerMoves.size() > 20) {
playerMoves.remove(0);
}
因为您想删除最旧的移动。
编辑:
我刚刚注意到,当你打印元素时,你会以相反的顺序迭代列表,但你的循环有错误的索引。它应该是:
int i = playerMoves.size() - 1; i >= 0; i--)
如果您使用该循环,则无需更改record
方法。
如果您确实更改了列表中元素的顺序,则可以简化显示方法:
public void displayPlayerMoves()
{
System.out.print(playerMoves.size() + " moves: ");
bool first = true;
for(int value : playerMoves) {
if (!first)
System.out.print(", ");
first = false;
System.out.print(value);
}
System.out.print('.');
}
答案 1 :(得分:1)
您应该在末尾添加值,并从列表的开头删除旧值:
playerMoves.add(value);
if(playerMoves.size() > 20) {
playerMoves.remove(0);
}
请注意,从列表开头删除O(n)
ArrayList
操作;更改为LinkedList
将为O(1)
。
但如果您坚持使用ArrayList
,则应在添加第二个元素之前删除第20个元素,因为添加第21个元素会导致ArrayList
必须增加其容量。
答案 2 :(得分:0)
您的代码有两个缺陷:
首先添加索引并按相反顺序打印。
将添加元素更改为:
playerMoves.add(value);
和循环打印为:
for(int i =0; i <playerMoves.size(); i++) {
// your code
}