Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java重新组织列表_Java_Sorting - Fatal编程技术网

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