Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用某些列对CSV文件进行排序_Java_Sorting_Csv - Fatal编程技术网

如何在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整数和字符串。我的意思是,我怎么能有两个比较器。你能写一些代码吗?链接问题的答案清楚地表明,它将列作为字符串进行比较。你需要按照问题注释中的建议,创建一个代表每行的数据类。链接问题的答案清楚地表明它是将列作为字符串进行比较。您需要遵循问题注释中的建议,并创建一个表示每行的数据类。