反向打印阵列中的前20个项目,然后反向打印下20个项目,依此类推

时间:2014-09-21 20:44:33

标签: java arrays printing reverse

所以我正在处理我的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);
            }
        }
    }
}

我想知道是否有人可以帮助我,不知道我能从这里做些什么。

3 个答案:

答案 0 :(得分:1)

首先,只要counter达到20的倍数以及点击max时,就需要打印列表。然后,在打印s的内容后,清除列表:

s.clear();

这将删除所有元素,以便它将再次填满。您还需要在for循环退出后打印列表,否则最后几个项目将保持未打印状态。

请注意,您未在此代码中的任何位置使用数组。您使用LinkedList来遵循作业精神并不清楚。但只有你知道这个标题是什么。

答案 1 :(得分:0)

对于这部分问题:

  

我被告知以相反的顺序打印数组中的前20个项目,然后再按相反的顺序打印接下来的20个项目,依此类推,直到我到达阵列的末尾。

一个简单的解决方案是:

  • 在数组中迭代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
    }

}