Java:如何颠倒ArrayList

时间:2016-01-24 01:11:29

标签: java arraylist iteration reverse readfile

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

所以例如输出应该是这样的:行: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行并将其写入输出文件。我一直无法找到在整个数据集中迭代地实现这种类型模式的方法,确保我没有遇到索引超出范围的错误。

4 个答案:

答案 0 :(得分:4)

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

  1. 阅读十行。
  2. 反转这些行 1
  3. 写出十条反向线。
  4. 重复,直到处理完整个文件。
  5. 当文件不是10行的倍数时,唯一的边缘情况是在最后做一些合适的事情。

    这种相同的流式处理方法可用于创建 new 每10个反向列表。它只会变得复杂而且变得复杂。当试图改变原始列表时。

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

答案 1 :(得分:1)

两种方法:

  1. 如果它已经在内存中,则在ArrayList中,只需更新该列表。
  2. 如果尚未在内存中,则一次处理10行 这样可以处理无限大的数据,而不会耗尽内存。
  3. 选项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]);
    }
    

答案 2 :(得分:1)

试试这个

    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);

答案 3 :(得分:0)

使用辅助计数器变量和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);
}

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

相关问题