如何使用java中的某些列对CSV文件进行排序

时间:2017-04-13 13:08:33

标签: java sorting csv

我尝试根据三列的值对制表符分隔的文件进行排序。但它没有正确排序。我怎么能解决这个问题呢? 我使用了这个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

3 个答案:

答案 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()));
            }
        };
    }
相关问题