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.
- 写出十个反转的线条。
- 重复直到处理完整个文件。
唯一的边缘情况是当文件不是 10 行的倍数时在最后做一些适当的事情。
同样的流式传输方法可用于创建 new each-10 反向列表。它仅在 'becomes complicated' 尝试改变原始列表时。
1 可以通过在写入输出时向后迭代十行列表来组合步骤 2 和 3。
两种方法:
- 如果它已经在内存中,在
ArrayList
中,只需更新该列表即可。
- 如果不在内存中,一次处理 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);
}
我唯一担心的是,您似乎只是继续添加到现有数组,而不是重新排序或将元素添加到新数组?
我有一个包含数千行单词的输入文本文件,我想在其中写入输出文件,我在其中每 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.
- 写出十个反转的线条。
- 重复直到处理完整个文件。
唯一的边缘情况是当文件不是 10 行的倍数时在最后做一些适当的事情。
同样的流式传输方法可用于创建 new each-10 反向列表。它仅在 'becomes complicated' 尝试改变原始列表时。
1 可以通过在写入输出时向后迭代十行列表来组合步骤 2 和 3。
两种方法:
- 如果它已经在内存中,在
ArrayList
中,只需更新该列表即可。 - 如果不在内存中,一次处理 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);
}
我唯一担心的是,您似乎只是继续添加到现有数组,而不是重新排序或将元素添加到新数组?