如何将存储在文本文件中的数据读入数组,然后对该数据进行排序并存储

时间:2014-04-04 14:21:35

标签: java arrays sorting file-io

我有一个包含10行的文本文件。每行有10个以逗号分隔的元素,这些元素已经按行排序,如:

3463,34957,44443,50481,71036,73503,74289,76671,82462,92527
1456,2731,18159,20440,32962,38562,49321,64220,67615,72541
1073,6217,9695,27372,30624,38021,47851,68479,76834,88021
7930,11882,17681,27267,32131,45096,59008,69156,72843,94146
2381,4359,30194,40730,73714,74721,75127,78830,86753,89475
1466,21335,21369,23342,36973,50888,67891,78069,90346,99970
15015,16628,21012,25483,42387,42519,45472,49552,57193,71449
1751,8833,35433,39972,44475,47604,51601,59108,87957,94764
10728,17248,31885,41453,41479,54785,81400,83554,86014,87105
228,9479,25187,50956,70720,71878,78744,84341,86637,88225

现在我想在不打扰行顺序的情况下对这100个元素进行排序(即:最小数字(228)应该在第一个位置,最大数字(99970)应该在最后一个位置,我需要存储那些完全排序的数字到另一个文件。

我在Array中添加这些数字时遇到问题,然后我想知道如何对它们进行排序。约束条件不应超过10个元素,一次应在RAM中。

我已经开始为此目的编写一些代码来从文件中获取数据:

public static void main(String args[])
{
    File file = new File("SortedLines.txt");
    FileInputStream fis = null;
    String st;
    try 
    {
        fis = new FileInputStream(file);

        int content;
        while ((content = fis.read()) != -1) 
        {
            // convert to char and display it
            System.out.print((char)content);
        }
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    } 
}

3 个答案:

答案 0 :(得分:0)

每行:

  1. 通过','
  2. 拆分从文件读取的字符串
  3. 创建一个new Integer[splittedString.length],遍历字符串数组,使用Integer从该字符串创建Integer.parseInt(..)并将其放在创建的Integer[]的适当位置
  4. 使用创建的数组
  5. 调用Arrays.sort(..)

答案 1 :(得分:0)

如果要排序的数字符合您上面提到的顺序,您只需使用Arrays.sort():

  • 创建一个包含所有数字的数组(我理解这些是整数),比如myUnsortedArray

  • 致电Arrays.sort(myUnsortedArray)

那应该做排序数组的工作。然后,您可以按照自己的方式进行转换。

希望这有帮助。

答案 2 :(得分:0)

以上答案的评论似乎在这里稍微改变了问题。你说的问题如下:

  

实际上我有一个包含1000个条目的100万个文件   * 1000矩阵形式,我一次不能在RAM中使用超过10000个元素

然后:

  

"你获得了数百万的数字,你必须找到第100名   最小的数字。"问题约束:不超过10,000个元素   可以一次在RAM中

我建议您编辑原始问题以反映此问题 - 如果这确实是您要解决的最终问题。

我对你的问题的理解是:你必须在1000 * 1000矩阵中找到第100个最小的数字(请注意:这与相当不同于说你的#1; 1百万个数字),约束条件是内存中不能超过10,000个数字。如果我是正确的,可能的解决方案可能是:

  1. 在内存中加载一个矩阵行作为数组,让我们称之为minValues
  2. 按照之前的建议将其排序为Arrays.sort()
  3. 保留临时变量中的最低和最高值,让我们称之为ab
  4. 对于后续行的每个值,我们将其称为x,检查a < x < b是否为minValues。如果是这种情况,请在b中插入值。这会自然地将最后一个元素推出数组,因此您必须更改minValues
  5. 的值
  6. 在所有迭代结束时,b将包含矩阵中最小的100个元素,只需选择最后一个(即MinValues),这将是您的第100个最小元素。
  7. 您可以使用任何值对此方法进行参数化(例如,如果您需要最小的第157个元素),并且内存占用

      

    100个元素(a)+ 1000个元素(下面的行)   检查)+ 2(b和{{1}})= 1102个元素

    仍然低于最大10.000元素限制。速度方面的性能可能不是很好,但这种要求并不在图中 - 无论如何,在小内存要求下处理大量数据时,您必须交换一些性能。

    我喜欢听到更好的方法来实现目标。

    编辑:我建议您查看Frederickson and Johnson algorithm。它解决了O(K)时间内的问题,其中K是之后的元素(在你的情况下为100)。但不确定内存占用情况。

    希望这有帮助。