所以我正在处理我的Java任务,我给了一个大数组。 我被告知要以相反的顺序打印数组中的前20个项目, 然后再按相反的顺序打印接下来的20个项目,依此类推,直到我到达阵列的末尾。
我能够弄清楚如何反向打印第一个项目,但后来我无法实现让我继续从原始数组离开的地方。
我也只允许一次存储21件物品。
这是我到目前为止所拥有的(50项而不是20项)
public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
LinkedList<String> s = new LinkedList<String>();
int counter = 0;
int max = 50;
for (String line = r.readLine(); line != null; line = r.readLine()) {
if (counter < max) {
s.addFirst(line);
counter++;
}
if (counter == max) {
for (String n : s) {
System.out.println(n);
}
}
}
}
我想知道是否有人可以帮助我,不知道我能从这里做些什么。
答案 0 :(得分:1)
首先,只要counter
达到20的倍数以及点击max
时,就需要打印列表。然后,在打印s
的内容后,清除列表:
s.clear();
这将删除所有元素,以便它将再次填满。您还需要在for
循环退出后打印列表,否则最后几个项目将保持未打印状态。
请注意,您未在此代码中的任何位置使用数组。您使用LinkedList
来遵循作业精神并不清楚。但只有你知道这个标题是什么。
答案 1 :(得分:0)
对于这部分问题:
我被告知以相反的顺序打印数组中的前20个项目,然后再按相反的顺序打印接下来的20个项目,依此类推,直到我到达阵列的末尾。
一个简单的解决方案是:
另外,请记住最后一次打印可能少于20个元素。
int size = 20; // size of reversed chunks
for(int i = 0; i < array.length; i += size) {
int j = (i + (size - 1) < array.length) ? (i + size - 1) : array.length - 1;
for(; j >= i; j--) {
System.out.print(array[j] + " ");
}
}
但是,您的代码中没有数组,因此我不确定您的意思。您正在从文件中读取值,然后使用LinkedList
反向打印它们。反向打印(以及大多数&#34;反转&#34;操作)的更好,更自然的数据结构将是Stack
,尽管实现了LinkedList
的Java实现这样它就允许Stack
( LIFO )行为。它通常用作Queue
( FIFO )结构。我的回答也会使用LinkedList
来使其与您的方法保持一致,但考虑将来在这种情况下Stack
。
因此,既然您正在从文件中逐行读取数字,那么您可以执行以下操作:
您可以在LinkedList
顶部阅读并插入数字,直到达到max
值或文件结尾
您已经有那部分工作
将所有数字从LinkedList
的顶部删除,这将使它们按相反顺序打印
您正在打印它们但未通过调用s.clear()
一旦到达文件末尾,您最终可能会在LinkedList
中找到值,因为在到达max
项目之前您已到达文件末尾并且循环已完成但未打印任何内容。也可以打印这些值。
另一件事,似乎你没有写入文件,所以你不需要函数的PrintWriter
参数。
以下是代码:
public static void doIt(BufferedReader r) throws IOException {
LinkedList<String> s = new LinkedList<String>();
int counter = 0;
int max = 50;
for (String line = r.readLine(); line != null; line = r.readLine()) {
if (counter < max) {
s.addFirst(line);
counter++;
}
if (counter == max) {
while(!s.isEmpty()) { // remove and print in reverse order
System.out.println(s.removeFirst());
}
counter = 0; // reset counter
}
}
// print the remaining elements, if they exist
while(!s.isEmpty()) { // remove and print in reverse order
System.out.println(s.removeFirst());
}
}
答案 2 :(得分:0)
我希望这可以帮助你开始:
void example() {
for (int i = 0; i < 50; i++) { //fill array to be read (for this example)
myArray[i] = i;
}
readback();
}
void readback() {
int batch = 1; //represents a portion of the read operation
int batchSize = 20; //the size of the read portion
int pos = 0; //the current index of the array while it is being read
int hi; //the top of the batch
int lo; //the bottom of the batch
while (pos < myArray.length) {
if (batch*batchSize<myArray.length) { //make sure you are not going over the array boundary
hi = batch*batchSize;
lo = hi - batchSize;
} else {
hi = myArray.length;
lo = pos;
}
for (int i = hi - 1; i >= lo; i--) { //read
System.out.println(myArray[i]);
pos++;
}
batch++; //go to the next batch
}
}