[英]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.