我从一个看起来像这样的文本文件中读到了一个列表:
苹果
橘子
NEXT
衬衫
裤子
手套
袜子
NEXT
立方体
方
三角
NEXT
等...
对于各种不同的事情,这会重复很多次。我想知道如何读取此文件,然后以不同的随机顺序将其写回文本文件,但仍在其类别中。例如,形状(又名立方体,方形,三角形)可能首先跟随" NEXT" 然后是不同类别的事物。
到目前为止,我已经加载了文件并将所有内容放入一个字符串中,在" NEXT" 上使用split
命令进行辩论以分隔类别,不确定如何真正做到这一点。
void rearrange() {
String tempOrder = "";
try {
Scanner input = new Scanner(System.in);
File file = new File("./randomFile.txt");
input = new Scanner(file);
while (input.hasNextLine()) {
tempOrder += input.nextLine() + "\n";
}
String[] parts = tempOrder.split("NEXT");
//Not sure how to reorganize the array now randomly
} catch(Exception e) {
System.err.println(e);
}
}
答案 0 :(得分:1)
您可以尝试创建一个二维数组(数组数组)。 逐行读取您的文件并使用if语句来捕获该行是否显示" NEXT。"如果确实说" NEXT",则开始将单词写入下一个数组。然后,您可以随机化外部数组的索引。
psuedo-code看起来像这样:
array[ ][ ];
int category = 0;
int i = 0;
foreach line in file {
if line == "NEXT" {
category++;
i = 0;
continue;
}
array[category][i] = line;
i++;
}
答案 1 :(得分:1)
我会使用列表而不是数组来存储文件中的值。并使用 Collections.shuffle 随机重新排序每个子列表。这样可以避免连接每个输入,然后再次拆分(这似乎是多余的)。
编辑:我也会使用LinkedList而不是ArrayList,因为输入的数量是未知的,以避免频繁调整ArrayList的大小。
static void rearrange() {
List<LinkedList<String>> categoryList = new LinkedList<LinkedList<String>>();
final String NEXT = "NEXT";
try {
Scanner input = new Scanner(A.class.getResourceAsStream("randomFile.txt"));
LinkedList<String> singleCategory = new LinkedList<>();
String value = "";
while (input.hasNextLine()) {
value = input.nextLine();
if (value.equals(NEXT)) {
categoryList.add(singleCategory);
singleCategory = new LinkedList<>(); // create a new category when the line is NEXT
} else {
singleCategory.add(value);
}
}
if (!value.equals(NEXT)) {
categoryList.add(singleCategory); // don't forget to add the last category
}
for (LinkedList<String> category : categoryList) {
Collections.shuffle(category); // randomly rearrange each category
}
for (LinkedList<String> category : categoryList) {
for (String singleValue : category) {
System.out.println(singleValue);
}
System.out.println(NEXT);
}
} catch (Exception e) {
System.err.println(e);
}
}