我有一个包含数千行单词的输入文本文件,我想写入输出文件,其中我反转每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行并将其写入输出文件。我一直无法找到在整个数据集中迭代地实现这种类型模式的方法,确保我没有遇到索引超出范围的错误。
答案 0 :(得分:4)
使用简单的流媒体方法。这基本上是当前解决方案应用每行十行,而不是最后一次。
当文件不是10行的倍数时,唯一的边缘情况是在最后做一些合适的事情。
这种相同的流式处理方法可用于创建 new 每10个反向列表。它只会变得复杂而且变得复杂。当试图改变原始列表时。
1 步骤2和3可以通过在写入输出时向后迭代十行的列表来组合。
答案 1 :(得分:1)
两种方法:
ArrayList
中,只需更新该列表。选项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);
}
我唯一担心的是你似乎只是继续添加到现有数组而不是重新排序或将元素添加到新数组中?