Java重新组织列表

时间:2015-11-07 17:40:05

标签: java sorting

我从一个看起来像这样的文本文件中读到了一个列表:

  

苹果
  橘子
  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);
    }
}

2 个答案:

答案 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);
    }
}