如何在java中使用某些列对CSV文件进行排序
我尝试根据三列的值对以制表符分隔的文件进行排序。但排序不正确。我如何解决这个问题? 我使用的代码写在这个 输出如下:如何在java中使用某些列对CSV文件进行排序,java,sorting,csv,Java,Sorting,Csv,我尝试根据三列的值对以制表符分隔的文件进行排序。但排序不正确。我如何解决这个问题? 我使用的代码写在这个 输出如下: clueweb09-en0000-12-00000 10722 10732 0.995358 0.000336 /m/0cbx95 clueweb09-en0000-12-00000 10736 10746 0.950789 0.000697 /m/01n7q clueweb09-en0000-12-0000
clueweb09-en0000-12-00000 10722 10732 0.995358 0.000336 /m/0cbx95
clueweb09-en0000-12-00000 10736 10746 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 11230 11237 0.829546 0.000291 /m/03jm5
clueweb09-en0000-12-00000 13009 13024 0.540326 0.000085 /m/012qgt
clueweb09-en0000-12-00000 13050 13060 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 1338 1348 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 1864 1874 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 2018 2028 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 2745 2752 0.78671 0.000722 /m/02jx1
clueweb09-en0000-12-00000 2823 2829 0.956747 0.000476 /m/04jpl
clueweb09-en0000-12-00000 2856 2862 0.649632 0.000007 /m/0gs0g
我想要这个输出:
clueweb09-en0000-12-00000 1338 1348 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 1864 1874 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 2018 2028 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 2745 2752 0.78671 0.000722 /m/02jx1
clueweb09-en0000-12-00000 2823 2829 0.956747 0.000476 /m/04jpl
clueweb09-en0000-12-00000 2856 2862 0.649632 0.000007 /m/0gs0g
clueweb09-en0000-12-00000 10722 10732 0.995358 0.000336 /m/0cbx95
clueweb09-en0000-12-00000 10736 10746 0.950789 0.000697 /m/01n7q
clueweb09-en0000-12-00000 11230 11237 0.829546 0.000291 /m/03jm5
clueweb09-en0000-12-00000 13009 13024 0.540326 0.000085 /m/012qgt
clueweb09-en0000-12-00000 13050 13060 0.950789 0.000697 /m/01n7q
此时,数字被视为字符串,但它们是左对齐的,并按这种方式排序。
您需要更改比较函数来处理此问题,或者在读取文件时将这些数字转换为右对齐的字符串。此时这些数字被视为字符串,但它们是左对齐的,并以这种方式排序。
您需要更改compare函数来处理这个或,当您读取文件时,将这些数字转换为右对齐的字符串。为要排序的列编写一个您自己的比较器。正如Walter所说,当前您将以字符串形式获取数据,将其转换为对象列表,并使用比较器进行排序。
希望这能有所帮助。为要排序的列编写一个自己的比较器。正如Walter所说,目前您将以字符串形式获取数据,将其转换为对象列表,并使用比较器进行排序。
希望这有帮助。我通过将此函数的比较函数更改为以下代码来解决问题
private static <T> Comparator<List<T>> createComparator(
final Comparator<? super T> delegate, final int... indices)
{
return new Comparator<List<T>>()
{
@Override
public int compare(List<T> list0, List<T> list1)
{
T element0 = list0.get(indices[0]);
T element1 = list1.get(indices[0]);
int n = delegate.compare(element0, element1);
if (n != 0)
{
return n;
}
else
return Integer.compare(Integer.parseInt(list0.get(indices[1]).toString()), Integer.parseInt(list1.get(indices[1]).toString()));
}
};
}
专用静态比较器createComparator(
final ComparatorI通过将此函数的比较函数更改为以下代码来解决问题
private static <T> Comparator<List<T>> createComparator(
final Comparator<? super T> delegate, final int... indices)
{
return new Comparator<List<T>>()
{
@Override
public int compare(List<T> list0, List<T> list1)
{
T element0 = list0.get(indices[0]);
T element1 = list1.get(indices[0]);
int n = delegate.compare(element0, element1);
if (n != 0)
{
return n;
}
else
return Integer.compare(Integer.parseInt(list0.get(indices[1]).toString()), Integer.parseInt(list1.get(indices[1]).toString()));
}
};
}
专用静态比较器createComparator(
最后一个比较器你能解释一下我应该如何更改比较函数吗?你的意思是我需要两个比较函数一个用于字符串,一个用于整数?在这里检查一下。我相信这会有帮助。按照你提到的代码,当读取CSV文件时,每个元素都作为字符串读取,比较器函数假设你有一个可比较的对象。正确的方法不是将数据加载到字符串列表中,而是创建一个对象并正确解析从文件中获得的数据。然后创建一个比较器,如Porkko的示例。您能解释一下如何更改比较函数吗?您的意思是我需要两个比较函数,一个用于字符串,一个用于整数呃?在这里查看..我相信这会有帮助..按照您引用的代码,当读取CSV文件时,每个元素都会被读取为字符串,comparator函数会假设您有一个可比较对象的数组。正确的方法不是将数据加载到字符串列表中,而是创建一个对象并正确解析从文件中获得的数据。并且创建一个比较器,就像Porkko的例子一样。我知道问题是比较字符串而不是整数。但我不知道如何将比较器写入handell integer和string。我的意思是,如何才能有两个比较器。你能写一些代码吗?我知道问题是比较字符串而不是整数。但我不知道如何将比较器写入handell整数和字符串。我的意思是,我怎么能有两个比较器。你能写一些代码吗?链接问题的答案清楚地表明,它将列作为字符串进行比较。你需要按照问题注释中的建议,创建一个代表每行的数据类。链接问题的答案清楚地表明它是将列作为字符串进行比较。您需要遵循问题注释中的建议,并创建一个表示每行的数据类。