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