Java重新组织列表
我从一个文本文件中读取了一个列表,如下所示:Java重新组织列表,java,sorting,Java,Sorting,我从一个文本文件中读取了一个列表,如下所示: array[ ][ ]; int category = 0; int i = 0; foreach line in file { if line == "NEXT" { category++; i = 0; continue; } array[category][i] = line; i++; } 苹果 橙子 下一步 衬衫 裤子 手套 袜子 下一步 立方体 方形 三角形 下一步 等等 对于各种不同的事情,这会
array[ ][ ];
int category = 0;
int i = 0;
foreach line in file {
if line == "NEXT" {
category++;
i = 0;
continue;
}
array[category][i] = line;
i++;
}
苹果橙子
下一步
衬衫
裤子
手套
袜子
下一步
立方体
方形
三角形
下一步
等等 对于各种不同的事情,这会重复很多次。我想知道如何读入这个文件,然后以不同的随机顺序将它写回一个文本文件,但仍然是它们的类别。例如,形状(又名立方体、正方形、三角形)可能首先后跟一个“下一个”,然后是另一类东西 到目前为止,我已经加载了该文件并将所有内容放在一个字符串中,讨论了如何在“下一步”中使用
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);
}
}
您可以尝试创建一个二维数组(数组数组)。 逐行读取文件,并使用if语句捕捉该行是否显示“NEXT”。如果该行确实显示“NEXT”,则开始将单词写入下一个数组。然后可以将外部数组的索引随机化 psuedo代码将如下所示:
array[ ][ ];
int category = 0;
int i = 0;
foreach line in file {
if line == "NEXT" {
category++;
i = 0;
continue;
}
array[category][i] = line;
i++;
}
我将使用列表列表而不是数组来存储文件中的值。并使用集合。随机移动对每个子列表进行随机重新排序。这将避免连接每个输入,然后再次拆分(这似乎是多余的) 编辑:我也会在ArrayList上使用LinkedList,因为输入的数量未知,以避免频繁调整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);
}
}
静态void重排(){
List categoryList=新建LinkedList();
最后一个字符串NEXT=“NEXT”;
试一试{
扫描仪输入=新扫描仪(A.class.getResourceAsStream(“randomFile.txt”);
LinkedList singleCategory=新建LinkedList();
字符串值=”;
while(input.hasNextLine()){
value=input.nextLine();
如果(值等于(下一个)){
categoryList.add(singleCategory);
singleCategory=new LinkedList();//下一行时创建一个新类别
}否则{
单一类别。添加(值);
}
}
如果(!value.equals(下一个)){
categoryList.add(singleCategory);//不要忘记添加最后一个类别
}
for(LinkedList类别:categoryList){
Collections.shuffle(category);//随机重新排列每个类别
}
for(LinkedList类别:categoryList){
for(字符串单值:类别){
System.out.println(单值);
}
System.out.println(下一步);
}
}捕获(例外e){
系统错误println(e);
}
}
如果您已将整个文件加载到一个字符串对象中,则可以使用换行符将各个项目拆分为一个数组。然后,您可以使用for循环检查NEXT对数组进行排序,以便对每个类别执行不同的操作。为了得到更多的帮助,你需要展示一些工作,确切地说,你遇到了什么困难,犯了什么错误。这里的人不喜欢为看起来像家庭作业的东西编写代码。你可以继续阅读。@Kenney目前正在使用字符串拆分,请参阅我随附的代码。问题是以字符串形式或数组形式排列类别。在换行符上再次拆分。那么,您读取每一行,连接它们,然后再次拆分它们?肯尼还建议进一步分裂?哇!Lain,您已经拥有了类别的每个元素,所以将它们分别存储在合适的集合中,如。为每个类别创建一个新列表。然后使用获取随机顺序。数组?你想让这个数组有多大,以确保包含未知数量类别的整个文件适合它?根据记录,它目前大约有25万个项目,大约有8万个分类,并且每天都在增长。时间对于排序和其他东西来说并不是非常重要,因为这个程序不需要实时完成或做其他任何事情。@Tom我不是说清楚,而是说概念。在Java中,ArrayList类是动态调整大小的。你也可以使用向量。即使解释了这个概念,你也可以避免命名不合适的数据类型;P