簡體   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