繁体   English   中英

如何在Java中按文件排序

[英]How to sort in a file by in java

我有一种方法,该方法将读取文本文件并写入一个临时文本文件(用于重写),然后删除旧的文件。 该函数先读取,然后排序,然后重写。

我有这种方法:

public void sortFile()
{
    String line; int count = 0; int min;
    int j=0;
    try
    {
        BufferedReader asd = new BufferedReader(new FileReader(list));
        while((line=asd.readLine()) != null)
        {
            count++; //count how many lines
        }
        Object temp,temp1,temp2,temp3;
        String names[] = new String[count];
        Double timeInd[] = new Double[count];
        String scores[] = new String[count];
        String difficulty[] = new String[count];

        while((line=asd.readLine()) != null)
        {
            String var[] = line.split("-");
            names[j] = var[0];
            timeInd[j]=Double.parseDouble(var[1]);
            scores[j] = var[2];
            difficulty[j] = var[3];
            j++;
        }
        asd.close();

        if(count!=1)
        {
            for(int i=0; i<count; i++) //Selection sort
            {
                min=i;
                for(int a=1; a<count ; a++) 
                {
                    if(timeInd[a]<timeInd[min]) min=a;
                }
                //swap values;
                temp=names[i];
                temp1=timeInd[i];
                temp2=scores[i];
                temp3=difficulty[i];
                ////////
                names[i] = names[min];
                timeInd[i]= timeInd[min];
                scores[i] = scores[min];
                difficulty[i] = difficulty[min];
                /////////
                names[min] = (String) temp;
                timeInd[min] = (Double) temp1;
                scores[min] = (String) temp2;
                difficulty[min] = (String) temp3;

            }
        }
        //rewrite the new sorted values;
        PrintWriter write = new PrintWriter(new FileWriter(tempo,true));
        for(int i=0;i<count;i++)
        {
            write.println(names[i]+"-"+timeInd[i]+"-"+scores[i]+"-"+difficulty[i]);
        }

        write.close();
        list.delete();
        tempo.renameTo(list);
    }catch(Exception e){};

}

我的文本文件包含以下内容:

myName-12.999-100-Easy

我将它们分为4。您可以在上面的代码中进行检查。 第一个是名称,第二个是时间,第三个是分数,第四个是难度。 现在我的问题是我想将文件按升序排序,这种排序的依据是时间。 时间最快的人当然是最重要的。 我顺便用了选择排序。 然而。 如果我的文本文件只有一行值。 类似于上面的示例内容:

myName-12.999-100-Easy 

新的重写文本文件现在将具有:

null-null-null-null

即使我用if(count!= 1)捕获了它

但是,如果我有多个这样的记录:

hisName-14.542-100-Easy
herName-1.432-100-Easy

它不会产生null-null-null-null,但是会产生相同的结果。 还没有排序。 为什么? 我不知道这背后的逻辑问题是什么。 我希望你能帮助我。 干杯。

第一点,

您已经阅读了一次完整的内容,

while((line=asd.readLine()) != null)
        {
            count++; //count how many lines
        }

如果不重置流,则不能真正在BufferedReader上使用它,因为它只能重置一定数量的字节(缓冲区大小)。 如果文件大于该文件,它将无法正常工作,请尝试再次读取该文件。 您将永远无法做到。 由于读者已经到达文件末尾。

while((line=asd.readLine()) != null)
        {
            count++; //added now  ----> 1
            String var[] = line.split("-");
            names[j] = var[0];
            timeInd[j]=Double.parseDouble(var[1]);
            scores[j] = var[2];
            difficulty[j] = var[3];
            j++;
        }

因此,您可以在第二个while循环内添加计数。 请参阅第二个while循环中的注释。

第二点

不要抑制异常:

catch(Exception e){};

解决以上两个问题将帮助您调试代码。

关于代码审查,您可以进行以下更改以使运行顺利。

创建一个class.structure来表示一行:

class Data implements Comparable
{
   String name;
   Double timeInd;
   String score;
   String difficulty;
}

当您遍历文件中的每一行时,请创建一个数据对象并填充其属性。

循环完成后,您将获得一个列表。

编写一个比较器,该比较器根据两个Data对象的时间ID对其进行比较。

http://www.tutorialspoint.com/java/java_using_comparator.htm

现在使用

Collections.sort(List,comparator),对列表进行排序。 迭代排序的数据列表,然后将属性写入所需的任何格式的新文件。

实施注意事项:此实现是一种稳定的,自适应的,迭代的归并排序,当对输入数组进行部分排序时,所需的比较少于n lg(n),而当对输入数组进行随机排序时,它提供了传统归并排序的性能。

从效率或代码可维护性的角度来看,选择排序都不是一个好方法。

最好的办法是将String对象读到List<String> ,然后在列表上使用Collections.sort ,提供一个Comparator ,该Comparator比较两个String并根据String的时间确定它们的顺序。 这意味着您只需编写代码即可提取时间并进行两次比较。 其余的将全部由JDK处理(有效)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM