我尝试根据三列的值对制表符分隔的文件进行排序。但它没有正确排序。我怎么能解决这个问题呢? 我使用了这个page中编写的代码。
输出是这样的:
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
答案 0 :(得分:1)
此时将数字视为字符串,但它们保持对齐并按此方式排序。 您需要更改比较函数来处理此问题,或者,当您读取文件时,将这些数字转换为右对齐的字符串。
答案 1 :(得分:1)
为要排序的列编写自己的比较器。正如Walter所说,目前您将获取数据为字符串,将其转换为对象列表并使用比较器进行排序。 希望这会有所帮助。
答案 2 :(得分:0)
我通过将此page的 compare 函数更改为以下代码来解决问题。
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()));
}
};
}