Java:如何反转ArrayList中每N个元素的顺序

Java: how to reverse the order of every N elements in an ArrayList

我有一个包含数千行单词的输入文本文件,我想在其中写入输出文件,我在其中每 10 行反转一次顺序。我遍历了整个文本文件,并将其存储在 ArrayList<String> array 中,现在我正试图找出如何反转整个 ArrayList 中每 10 行的顺序。

所以例如输出应该是这样的: Line : 10, 9, 8, 7 ...... 1, 20, 19, 18, 17......11, 30, 29, 28、27.......21 等等,直到我对整个文本文件(存储在 ArrayList 中)完成此操作。下面是我一直用来尝试反转所述行的代码部分。

   for(int i = array.size()-1; i >= array.size()-10; i--){ 
     array.add(array.get(i));
   }

   for (String text : array) {
            w.println(text);
        }

 }

到目前为止,我只读取和反转输入文件的最后 10 行并将其写入输出文件。我一直无法找到一种方法在整个数据集中迭代实现这种类型的模式,确保我不会遇到索引越界错误。

使用简单的流式传输方法。这基本上是当前的解决方案 十行而不是最后应用一次。

  1. 阅读十行。
  2. 反转这些行1.
  3. 写出十个反转的线条。
  4. 重复直到处理完整个文件。

唯一的边缘情况是当文件不是 10 行的倍数时在最后做一些适当的事情。

同样的流式传输方法可用于创建 new each-10 反向列表。它仅在 'becomes complicated' 尝试改变原始列表时。


1 可以通过在写入输出时向后迭代十行列表来组合步骤 2 和 3。

两种方法:

  1. 如果它已经在内存中,在 ArrayList 中,只需更新该列表即可。
  2. 如果不在内存中,一次处理 10 行。
    这允许处理无限大的数据而不会 运行 内存不足。

选项 1.

List<String> list = new ArrayList<>();
// code filling list

for (int i = 0; i < list.size(); i += 10) {
    int endOfBlock = Math.min(i + 10, list.size());
    for (int j = i, k = endOfBlock - 1; j < k; j++, k--) {
        String temp = list.get(j);
        list.set(j, list.get(k));
        list.set(k, temp);
    }
}

选项 2.

try (BufferedReader in = new BufferedReader(new FileReader(inFile)),
     PrintWriter out = new PrintWriter(new FileWriter(outFile))) {
    String[] buf = new String[10];
    int len = 0;
    for (String line; (line = in.readLine()) != null; ) {
        buf[len++] = line;
        if (len == 10) {
            while (len > 0)
                out.println(buf[--len]);
        }
    }
    while (len > 0)
        out.println(buf[--len]);
}

试试这个

    for (int i = 0, size = array.size(); i < size; i += 10)
        for (int from = i, to = Math.min(i + 10, size); from < to;)
            Collections.swap(array, from++, --to);

使用辅助计数器变量和 if 语句来检查边界,例如:

while(counter<array.size()+10)
    int counter = 9; //since index 9 is the 10th line
    for(int i=counter; i>counter-10; i--){
        if(i<array.size()){
            array.add(array.get(i));
        }
    }
    counter+=10;
}
for (String text : array){
        w.println(text);
}

我唯一担心的是,您似乎只是继续添加到现有数组,而不是重新排序或将元素添加到新数组?